2014-09-05 94 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);