【问题标题】:search element in stl containersstl 容器中的搜索元素
【发布时间】: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)
  • 谢谢,我会记住这一点的 :)

标签: c++ boost stl


【解决方案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 也是如此)。
    猜你喜欢
    • 2011-06-03
    • 2011-07-08
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2010-12-15
    • 2011-04-10
    • 2013-04-07
    相关资源
    最近更新 更多