C++ STL容器列表、deque、vector等的基类是什么。?

C++ STL容器列表、deque、vector等的基类是什么。?,c++,templates,search,stl,C++,Templates,Search,Stl,我想写一个函数,可以采用STL通用列表、deque或vector,并在其中搜索一个键。这个函数的方法签名是什么?我们如何实现它 我所知道的是,如果我们接受函数参数中的任何派生类,我们可以使用基本抽象类,假设所有相关的派生类都具有解决问题所需的函数 编辑:我们无法在函数参数中传递容器的迭代器。如果可以,那很容易。它必须是一个容器 我在想:假设“Container”是来自STL容器的抽象基类(根据下面的第一个答案,它不是) 模板 bool搜索(std::容器C、T和key) 感谢幸运的是,标准库容器

我想写一个函数,可以采用STL通用列表、deque或vector,并在其中搜索一个键。这个函数的方法签名是什么?我们如何实现它

我所知道的是,如果我们接受函数参数中的任何派生类,我们可以使用基本抽象类,假设所有相关的派生类都具有解决问题所需的函数

编辑:我们无法在函数参数中传递容器的迭代器。如果可以,那很容易。它必须是一个容器

我在想:假设“Container”是来自STL容器的抽象基类(根据下面的第一个答案,它不是)

模板 bool搜索(std::容器C、T和key)


感谢

幸运的是,标准库容器没有基类。据我所知,在标准库中使用多态继承的唯一地方是streams,这正是它们获得如此坏名声的原因

标准容器是非多态的,因此速度很快。您必须使函数模板与任何容器一起工作

比如说,

template <class CONTAINER> bool exists(const CONTAINER& ctr, const typename CONTAINER::value_type& key); 
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
模板bool存在(const容器和ctr,const typename容器::value\u type和key);

容器没有基类。它们不基于动态多态性定义接口。它们基于静态多态性定义接口。也就是说,它们确实实现了某些共同的方法,但它们不是从某个原型继承的

因此,必须使用标准的C++机制来进行静态多态:模板。容器本身必须是模板参数:

template<typename Container, ...>
bool IsFound(const Container &c, ...);
模板
bool IsFound(常数容器和c等);
当然,这不会阻止任何用户传递不是
vector
deque
list
的类型。它们可以传递满足
IsFound
函数强加的隐式静态需求的任何内容


例如,您可以传递一个
集合
,它在某种程度上可能会起作用。但它的速度远不如使用类型调用
set::find

正如SergeyA在回答中提到的,C++的STL没有多态容器(与Java或C接口相反)

关于您请求的函数签名,请查看STL
标题。有许多函数对某些数据进行操作,使用指向数据块开头和结尾的两个指针(迭代器)。比如说,

template <class CONTAINER> bool exists(const CONTAINER& ctr, const typename CONTAINER::value_type& key); 
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );

他们没有基类。查看
函数以了解它们的作用。谢谢,但您的评论无助于回答问题。当提供一个范围时,大多数预定义函数都很有用,但我需要在STL容器中传递。谢谢,但您的评论对所问问题没有帮助——是的,它有帮助。声明STL容器没有基类。所以你的问题是基于一个错误的假设。所以,忘掉基类,想想如何用另一种方法来实现。我知道我们必须制作模板,但我想知道的是什么是函数签名。我们将为容器传递什么,key可以是定义为template的某种泛型类型T。@shaffooo,想想迭代器。我想你是说我们在调用函数中有一个STL容器,我们可以获取开始迭代器和结束迭代器,传入迭代器和key,并在该范围内搜索,或者使用“find”函数。我知道这个解决办法。这个问题是在一次采访中提出的,限制是我必须自己传递任何STL容器。那么函数参数是std::list还是std::deque或std::vector?我只能传入一个容器参数和一个键参数,比如search(std::container c,T key),这很有用。现在我们如何使这个容器接受模板数据类型。我们可以做模板来接受不同数据类型的容器,int或double等。对于STL容器,您可以通过使用
Container::value\u type
来了解类型。这就是我想要的。如何从该模板容器中获取迭代器?如果容器的类型为
T
,并且您的函数设计用于处理容器中的类型,那么在模板定义中不需要两个参数:
template bool Search(const container&container,const container::value\u type&value)
@shaffoo,如果您曾经不能使用
auto
,仍然可以通过
typename容器::[const_]iterator
约定来使用。@PaulMcKenzie,不幸的是,这可能会产生一些不希望的后果。例如,您有一个
std::string
的容器,并且您希望查找
“abc”
(除非足够长以至于SSO不适用)。现在,您需要创建一个新字符串,其中包含分配和全部。然而,这些问题通常并不令人担忧,除非您正在创建一个用户可能关心的库。这种方法的一个优点是,您可以使用大括号作为参数来构造值。@然后您就可以拥有函数模板的默认参数。举例说明:默认为
value::type
,否则使用提供的
T
类型。当然,我甚至不需要指定第一个模板参数——这是为了说明,如果提供了1个参数,默认值就会生效。