我有这样的代码......
std::vector<string>::iterator p;
p = find(v.begin(),v.end(),"asdasda");
cout << *p << endl;
如果“asdasda”不是向量的一部分,p指向一些垃圾,cout给出一个seg错误。什么应该是if声明会使cout执行onlyif“asdasda”被发现? 以及“asdasda”在v中的位置...就像我们之前宣称v [3]为“asdasda”一样, 那我怎么知道v [3]是“asdasda”?
答案 0 :(得分:12)
p
未指向“垃圾”,当找不到内容时,它只会变为v.end()
。
if (p != v.end()) {
std::cout << "v[" << (p - v.begin()) << "] = ";
std::cout << *p << std::endl;
}
答案 1 :(得分:4)
如果std::find
找不到任何内容,则在这种情况下迭代器设置为v.end()
。
if ( p != v.end() )
{
// iterator is good
}
另请注意std::find
的一般情况。
以下是它的典型定义:
namespace std {
template <class InputIterator, class T>
InputIterator find(InputIterator start,
InputIterator finish,
const T& value);
}
如果std::find
失败,它将返回finish
迭代器,因为搜索结果为[start, finish)
并包含start
但不包括finish
。
答案 2 :(得分:1)
如果找不到您搜索的值,则返回结束迭代器。
您可以在显示行之前添加if (p != v.end())
来避免错误。