STL 容器列表、deque、vector 等的基类是什么?
What is the base class for STL containers list, deque, vector etc.?
我想编写一个函数,该函数可以接受STL泛型列表,deque或向量中的任何一个,并在其中搜索键。这个函数的方法签名是什么,我们如何实现它?
我所知道的是,如果我们接受函数参数中的任何派生类,我们可以使用基本抽象类,假设所有相关派生类都具有问题所需的函数。
编辑:我们不能在函数参数中传递容器的迭代器。如果可以的话,这很容易。它必须是一个容器。
我在想:假设"容器"是来自 STL 容器的抽象基类(根据下面的第一个答案,它不是)。
模板bool Search(std::Container C, T&key );
谢谢
正如SergeyA在他的回答中提到的,C++的STL没有多态容器(与Java或C#接口相反)。
关于您请求的函数签名,请查看 STL <algorithm>
标头。有很多函数对某些数据进行操作,使用两个指针(迭代器)指向数据块的开头和结尾。例如
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
在[first, last)
搜索一些value
。
如果你真的想将整个容器传递给函数,你将同样地编写
template<class Container, class T>
bool Search(const Container& container, const T& value)
{
for (auto iterator = container.begin(); iterator != container.end(); ++iterator)
{
if (*iterator == value)
return true;
}
return false;
}
幸运的是,标准库容器没有基类。我所知道的唯一在标准库中使用多态继承的地方是流,这就是他们赢得如此糟糕的名声的原因。
标准容器是非多态的,因此速度很快。您必须使函数模板能够与任何容器一起使用。
例如
template <class CONTAINER> bool exists(const CONTAINER& ctr, const typename CONTAINER::value_type& key);
容器没有基类。它们不定义基于动态多态性的接口。它们定义基于静态多态性的接口。也就是说,它们确实实现了某些共同的方法,但它们不是从某个原型继承而来的。
因此,必须使用静态多态性的标准C++机制:模板。容器本身必须是模板参数:
template<typename Container, ...>
bool IsFound(const Container &c, ...);
当然,这不会阻止任何用户传递不vector
、deque
或list
的类型。它们可以传递任何满足IsFound
函数施加的隐式静态要求的内容。
例如,您可以通过一个set
,它可能会在某种程度上起作用。但它不会像使用该类型调用set::find
那么快。
- 当基类是依赖类型时,这是一个缺陷吗
- 标准库容器最简单、性能差的哈希类是什么?
- 继承基构造函数,基类是模板参数 (MSVC)
- 为什么模板名称在派生类中可用(基类是模板的实例)?
- 私下继承C++抽象基类是什么意思
- C++最接近追溯定义已定义类的超类是什么?
- 为什么将好奇模板模式的基类直接转换为另一个基类是错误的?
- 如果基类是公开继承的,那么基类的公共静态函数是否会成为派生类的成员函数
- 这个简单的C 模板类是什么问题
- 如何从基类中调用基类是模板参数的方法
- 递归模板成语如何避免基类是儿童课的朋友
- 在我的C++应用程序中定义IHaveVirtualDestructor基类是一种好的做法吗
- 抽象类与基类是一回事吗?
- STL 容器列表、deque、vector 等的基类是什么?
- 抽象基类有什么用
- 基类是抽象的,派生也是抽象的
- 验证我的超类或基类是宏或模板声称的那个类时出现问题
- 虚拟基类是如何存储的
- 重写嵌套类并返回外层类作为基类是合法的
- 多态性和数据隐藏:基类是覆盖还是忽略派生类的访问限制?