如何解决C++ 返回无效的迭代器
我的任务是:
编写一个函数,将一对迭代器带入一个向量,然后 一个整数值。在范围内查找该值并将迭代器返回到 请求的元素。
我对上述任务的实现是:
#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,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&,int);
函数按预期工作,not found
被打印到终端。为什么按值传递数据没有按预期工作?
解决方法
当 container
按值传递时,它是从参数复制的新 vector
。那么对于 return container.end();
,返回的迭代器属于 container
但与原来的 vector
numbers
无关。
您应该直接返回 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;
}
并通过与 e_iter
进行比较来检查结果。
iter found = contains(b_iter,e_iter,13);
if (found == e_iter)
cout << "not found" << endl;
else
cout << *found << endl;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。