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<std::string> &data, const std::string &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 容器中的搜索元素的主要内容,如果未能解决你的问题,请参考以下文章