0
list< int > a;

list < int > ::iterator it;

it = a.begin();

it=a.insert(it,10);
it=a.insert(it,210);
it=a.insert(it,310);
it=a.insert(it,410);
it=a.insert(it,510);


it = find(a.begin(),a.end(),180);

cout << *it << endl;

在此程序中,此列表中不存在值 180。所以根据 find STL 算法,它应该返回最后一个值,但是当我打印这个值时,它会出现一些垃圾。似乎迭代器指向其他位置。请帮我发现我的错误。

4

2 回答 2

2

a.end()不是最后一个值的迭代器,而是一个超过列表中最后一个元素的迭代器。绝不应以任何方式打印或访问它。在 的情况下std::find,您应该将返回值与结束迭代器进行比较。如果匹配,则该容器中没有与请求值匹配的元素。

it = find(a.begin(),a.end(),180);
if( a.end() == it ) { // using Yoda conditional
    cout << "no element matching value.." << endl;
} else {
    cout << *it << endl;
}
于 2013-10-07T02:16:00.747 回答
1

std::findend()如果在 STL 容器中找不到元素,则返回,取消引用end()是未定义的行为。

您需要it在取消引用之前测试迭代器:

it = find(a.begin(), a.end(), 180);
if (it != a.end())
{
  cout << *it << endl;
}

§ 25.2.5

返回: [first,last) 范围内满足以下相应条件的第一个迭代器 i:*i == value, pred(*i) != false, pred(*i) == false。如果没有找到这样的迭代器,则返回 last。

range[first,last)是半开范围,last表示end()不是容器中的最后一个元素。

于 2013-10-07T02:09:43.787 回答