2014-09-05 139 views
0

我試圖實現一個函數來查找2D矢量中的矢量。我已經寫的是:如何在C++中查找2D矢量中的矢量?

vector<vector<int> > result; 
vector<int> line; 
bool isPresent = find(result.begin(), result.end(), line) 

然而,這給出了一個錯誤

「第11行:不能轉換 '__gnu_cxx :: __ normal_iterator *,性病::矢量>>' 到 '布爾' 在初始化「

我搜索了很多論壇,但找不到正確的答案。什麼是最好的方式來做到這一點?

感謝, 肖恩

+1

'find'返回的迭代器不是布爾值。 – 2014-09-05 17:55:11

+0

你「搜索了很多論壇」,但並沒有簡單地諮詢最近的可用標準庫參考? Google上的第一批提供了這方面的例子。 – 2014-09-05 18:35:57

回答

4

InputIterator std::find(InputIterator first, InputIterator last, const T& val)

返回一個迭代到所述第一元件在範圍[第一,最後一個),其比較等於VAL。如果沒有找到這樣的元素,該函數最後返回。

而是使用:

bool isPresent = std::find(result.begin(), result.end(), line) != result.end(); 
//                ^^^^^^^^^^^^^^^ 

或:

bool isPresent = std::any_of(result.begin(), result.end(), 
          [&line](const std::vector<int>& x) 
          { return x == line; }); 
+0

+1 for'std :: any_of' – YoungJohn 2014-09-05 18:40:37

+0

明白了。謝謝您的幫助! – CSY 2015-04-02 01:05:52

0

我的第一個猜測是find回報在那裏找到你問它來找到該項目,而不是一個布爾迭代器。

應該是這樣的:

vector<vector<int> > result; 
vector<int> line; 
vector< vector<int> >::iterator it = find(result.begin(), result.end(), line); 
bool isPresent = (it != result.end()); 
1

更改您的代碼

bool isPresent = find(result.begin(), result.end(), line) != result.end(); 

這應該工作,只要你想它。如提到std::find()返回vector<vector<int> >::iterator,而不是bool

3

更改由:

bool isPresent = (find(result.begin(), result.end(), line) != result.end());

或更好如果允許C++ 11:

bool isPresent = (find(cbegin(result), cend(result), line) != cend(result));

的方法的容器的返回std::find匹配的元件的iteratorrange end最後在簽名方法中)如果元素不存在則提供。

template <class InputIterator, class T> 
InputIterator find (InputIterator first, InputIterator last, const T& val);