STL容器列表,双端队列,向量等的基类是什么?

时间:2016-02-22 20:29:39

标签: c++ templates search stl

我想编写一个函数,可以使用STL通用列表,双端队列或向量,并在其中搜索一个键。这个函数的方法签名是什么以及我们如何实现它?

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

编辑:我们无法在函数参数中传递容器的迭代器。如果我们能做到这一点很容易。它必须是一个容器。

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

模板 bool搜索(std :: Container C,T& key);

由于

3 个答案:

答案 0 :(得分:8)

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

关于您请求的功能签名,请查看STL <algorithm>标头。有许多函数在某些数据上运行,使用两个指针(迭代器)到数据块的开头和结尾。例如,

template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );

value中搜索一些[first, last)

如果你真的想将整个容器传递给函数,你也可以写

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;
}

答案 1 :(得分:3)

幸运的是,我们没有标准库容器的基类。我所知道的唯一一个在标准库中使用多态继承的地方是流,这就是为他们带来如此糟糕的名声。

标准容器是非多态的,因此速度很快。您必须使您的功能模板适用于任何容器。

例如,

template <class CONTAINER> bool exists(const CONTAINER& ctr, const typename CONTAINER::value_type& key); 

答案 2 :(得分:2)

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

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

template<typename Container, ...>
bool IsFound(const Container &c, ...);

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

例如,你可以传递一个set,它可能会在某种程度上起作用。但它不会像使用类型调用set::find一样快。