stl 容器中的搜索元素

Posted

技术标签:

【中文标题】stl 容器中的搜索元素【英文标题】:search element in stl containers 【发布时间】:2012-06-14 10:07:37 【问题描述】:

所以我一直在寻找一种在字符串列表中搜索字符串的方法。我已经编写了以下代码

bool contains(const std::list<std::string>& data, const std::string& str)

        std::list<std::string>::iterator i;
        for(i=data.begin(); i!=data.end(); ++i)
           
                if (str == *i) 
                        return true;
           

        return false;


这只是一个非常基本的代码。我知道 find 方法,但它包含 start 和 end 。理想的解决方案是使用整个容器。有一些相同的提升方法,但我不知道如何使用它们。你能举一些例子来提升查找元素的通用搜索吗?

【问题讨论】:

一个小建议,到目前为止,当调用您的函数时,参数已复制,如果您的列表很长,这可能会很糟糕。改用 (const) 引用:bool contains(const std::list&lt;std::string&gt; &amp;data, const std::string &amp;str) 谢谢,我会记住这一点的 :) 【参考方案1】:

std::find 可以接受 start 和 end 迭代器,基本上决定了整个容器:

std::find(data.begin(), data.end(), str);

【讨论】:

【参考方案2】:

使用Boost.Range:

#include <boost/range/algorithm/find.hpp>

auto i = boost::find(container, value);
if (i != boost::end(container))
  doSomething(*i);

【讨论】:

i = boost::find(data, value); if(*i == value) cout 不,在取消引用 i 之前,您必须确保 i != boost::end(container)。 auto i = boost::find(adresses, adress); if(i != boost::end(adresses) && (i)!= adress) .... 在编译时我得到这些错误: CoverDownloader.h:135:39: error: no match for ' operator' in '*i' 有什么想法为什么会出现? 首先,条件是没有意义的,因为 find() 可以返回一个迭代器到“地址”或结束迭代器。确保您的编译器支持 C++0x “auto”,否则显式定义迭代器类型。【参考方案3】:

为什么不使用类似的东西:

template <typename container, typename T>
bool contains(container& container, T& elt)

   return (std::find(container.begin(), container.end, elt) != container.end();

【讨论】:

你的参数顺序错误,应该是std::find(container.begin(), container.end, elt) 我认为这基本上是一个正确的答案,所以+1。但是看问题的最后,可能这里真正的问题是“我怎么称呼boost::find?” container 应该通过常量引用传递(如果关注效率,elt 也是如此)。

以上是关于stl 容器中的搜索元素的主要内容,如果未能解决你的问题,请参考以下文章

STL C++ 中的容器 [关闭]

STL——set

STL - 关联容器

STL中的查找算法

STL概念

STL————vector的用法