C++返回无效迭代器



我的任务是:

编写一个函数,该函数将一对迭代器带到一个向量int值。在范围中查找该值,并将迭代器返回到请求的元素。

我对上述任务的实现是:

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using data = vector<int>;
using iter = data::const_iterator;
iter contains(const data, iter, iter, int);
int main() {
data numbers{1, 2, 5, 7, 9, 14, 18};
iter b_iter = numbers.begin() + 2;
iter e_iter = numbers.end();
iter found = contains(numbers, b_iter, e_iter, 13);
if (found == numbers.end())
cout << "not found" << endl;
else
cout << *found << endl;
return 0;
}
iter contains(const data container, iter b_iter, iter e_iter, int num) {
while (b_iter != e_iter) {
if (*b_iter == num)
return b_iter;
b_iter++;
}
return container.end();
}

正如您所看到的,我从开始到结束进行迭代,如果找到了搜索到的值,就会返回。否则,函数将迭代器一次返回最后一个元素(container.end()(。但是这个程序将0输出到控制台,我期望not found在那里。当更新我的函数的第一个参数以引用数据而不是像这样的值时:

iter contains(const data&, iter, iter, int);

功能按预期工作,not found打印到终端。为什么按值传递数据不能按预期工作?

通过值传递container时,它是从参数复制的新vector。那么对于return container.end();,返回的迭代器属于container,但与原始vectornumbers无关。

您应该直接返回e_iter,而不需要像STL算法那样传递vector

iter contains(iter b_iter, iter e_iter, int num) {
while (b_iter != e_iter) {
if (*b_iter == num)
return b_iter;
b_iter++; // or ++b_iter; for efficiency
}
return e_iter;
}

并与CCD_ 13进行了比较。

iter found = contains(b_iter, e_iter, 13);
if (found == e_iter)
cout << "not found" << endl;
else
cout << *found << endl;

最新更新