C++ 返回无效的迭代器
C++ returning invalid iterator
我的任务是:
Write a function that takes a pair of iterators to a vector and
an int value. Look for that value in the range and return iterator to
requested element.
我对上述任务的实现是:
#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();
}
如您所见,我从头到尾迭代,return 如果找到搜索值。否则,函数 return 迭代器将传递最后一个元素 (container.end()
)。但是这个程序输出 0
到控制台,我期望 not found
。更新函数的第一个参数以引用数据而不是值时,如下所示:
iter contains(const data&, iter, iter, int);
函数按预期工作,not found
打印到终端。为什么按值传递数据没有按预期工作?
当 container
按值传递时,它是从参数复制的新 vector
。那么对于return container.end();
,returned迭代器属于container
但与原来的vector
无关 numbers
.
你应该直接 return e_iter
,不需要传递 vector
,就像 STL 算法一样。
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;
我的任务是:
Write a function that takes a pair of iterators to a vector and an int value. Look for that value in the range and return iterator to requested element.
我对上述任务的实现是:
#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();
}
如您所见,我从头到尾迭代,return 如果找到搜索值。否则,函数 return 迭代器将传递最后一个元素 (container.end()
)。但是这个程序输出 0
到控制台,我期望 not found
。更新函数的第一个参数以引用数据而不是值时,如下所示:
iter contains(const data&, iter, iter, int);
函数按预期工作,not found
打印到终端。为什么按值传递数据没有按预期工作?
当 container
按值传递时,它是从参数复制的新 vector
。那么对于return container.end();
,returned迭代器属于container
但与原来的vector
无关 numbers
.
你应该直接 return e_iter
,不需要传递 vector
,就像 STL 算法一样。
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;