sha*_*ooo 3 c++ search templates stl
我想编写一个函数,可以使用STL通用列表,双端队列或向量,并在其中搜索密钥.这个函数的方法签名是什么?我们如何实现它?
我所知道的是,如果我们接受函数参数中的任何派生类,我们可以使用基本抽象类,假设所有相关的派生类都具有您的问题所需的函数.
编辑:我们不能在函数参数中传递容器的迭代器.如果我们能做到这一点很容易.它必须是一个容器.
我在想:假设'Container'是来自STL容器的抽象基类(根据下面的第一个答案,它不是).
模板bool搜索(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 );
Run Code Online (Sandbox Code Playgroud)
寻找一些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;
}
Run Code Online (Sandbox Code Playgroud)
幸运的是,标准库容器没有基类。我所知道的在标准库中使用多态继承的唯一地方是流,这就是它们赢得如此糟糕名声的原因。
标准容器是非多态的,因此速度很快。您必须使您的函数模板与任何容器一起使用。
例如,
template <class CONTAINER> bool exists(const CONTAINER& ctr, const typename CONTAINER::value_type& key);
Run Code Online (Sandbox Code Playgroud)