C++ stl容器中的搜索元素

C++ stl容器中的搜索元素,c++,boost,stl,C++,Boost,Stl,所以我在寻找一种在字符串列表中搜索字符串的方法。我已经编写了以下代码 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) {

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

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;

}
这只是一个非常基本的代码。我知道这个方法,但它从开始到结束都需要。理想的解决方案是把整个容器拿走。也有一些相同的boost方法,但是我不知道如何使用它们。你能举一些boost find的例子来进行元素的一般搜索吗。

std::find可以使用开始迭代器和结束迭代器,它们基本上决定了整个容器:

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

为什么不按照下面的思路使用一些东西:

template <typename container, typename T>
bool contains(container& container, T& elt)
{
   return (std::find(container.begin(), container.end, elt) != container.end();
}
使用:


一个小建议,现在调用函数时,参数会被复制,如果列表很长,这可能是不好的。改为使用常量引用:bool contains const std::list&data,const std::string&strTanks我会记住:参数顺序错误,应该是std::findcontainer.begin,container.end,elt我认为这基本上是一个正确的答案,所以+1。但看问题的结尾,这里真正的问题可能是如何调用boost::find?容器应该通过常量引用和elt传递,如果考虑效率的话;如果*i==value coutNo,则必须确保i!=boost::endcontainer,在取消引用i.auto之前i=boost::FindAddress,Address;如果!=boost::endAddresses&&i!=地址{…}编译时,我得到了这些errros:CoverDownloader.h:135:39:error:no match'operator'in'*I'知道为什么会出现这种情况吗?首先,条件是没有意义的,因为find可以将迭代器返回到地址或结束迭代器。确保编译器支持C++0x auto,否则显式定义迭代器类型。
#include <boost/range/algorithm/find.hpp>

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