如何在C++中找出2D向量中的一个向量?

4

我正在尝试实现一个在2D向量中查找向量的函数。我编写的代码如下:

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

然而,这会导致一个错误:

"Line 11: cannot convert ‘__gnu_cxx::__normal_iterator*, std::vector > >’ to ‘bool’ in initialization"

我在许多论坛上搜索了很多,但找不到正确的答案。最好的方法是什么?

谢谢, Shawn


1
find 返回一个迭代器而不是布尔值。 - Captain Obvlious
你“搜索了许多论坛”,但是没有简单地查阅最近可用的标准库参考资料吗?谷歌上的第一个提供了这样的例子。 - Lightness Races in Orbit
4个回答

9

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

返回一个迭代器,指向范围[first,last)中第一个与val相等的元素。如果没有找到这样的元素,则函数返回last。

建议使用:

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; });

明白了。感谢你的帮助! - CSY

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 方法会返回一个 iterator,指向匹配给定元素的位置;如果元素不存在,则返回提供的range end(在方法签名中称作 last)。

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

1
我第一次猜测是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接