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

What is the base class for STL containers list, deque, vector etc.?

本文关键字:基类 是什么 deque 列表 STL vector      更新时间:2023-10-16

我想编写一个函数,该函数可以接受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, ...);

当然,这不会阻止任何用户传递不vectordequelist的类型。它们可以传递任何满足IsFound函数施加的隐式静态要求的内容。

例如,您可以通过一个set,它可能会在某种程度上起作用。但它不会像使用该类型调用set::find那么快。