2012-06-14 46 views
0

所以我正在尋找一種方法來搜索字符串列表中的字符串。我編碼如下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) 
     { 
       if (str == *i) 
         return true; 
     } 

     return false; 

} 

這只是一個非常基本的代碼。我知道find方法,但它需要在開始和結束。理想的解決方案將採取整個容器。有一些提升方法相同,但我不知道如何使用它們。你可以舉一些例子來尋找元素的通用搜索。

+1

一個小建議,截至目前,當你調用你的函數參數rs是_copied_,如果列表很長,這可能會很糟糕。使用(const)引用來代替:'bool contains(const std :: list &data,const std :: string&str)' –

+0

謝謝我會記住這一點:) –

回答

3

使用Boost.Range

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

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

i = boost :: find(data,value); if(* i == value) cout <<「value present」; else cout <<「value not present」; 對檢查值有用 –

+1

不,您必須確保i!= boost :: end(容器),然後才能取消引用i。 –

+0

是啊謝謝我忘了 –

4

std::find可以發生在開始和結束迭代器,這基本上決定了整個容器:

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

爲什麼不使用的東西沿着這行:

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

你得到的參數順序錯誤,應該是'std: :find(container.begin(),container.end,elt)' – jpalecek

+1

我認爲這基本上是一個正確的答案,所以+1。但是看問題的結尾,這裏真正的問題可能是「我怎麼稱呼'boost :: find'?」 –

+0

'container'應該通過常量引用來傳遞(如果效率是一個問題,也應該傳遞'elt')。 –