比较迭代器时的怪异(?)行为
Weird (?) behavior when comparing iterators
我是C++的新手,所以这可能是一个简单的问题,但我正在学习Stanley Lippman的C++书,在这个练习中,你应该为int向量编写一个非常基本的搜索函数。基本上只是递增迭代器,直到找到要查找的内容,然后向元素返回迭代器。
我的第一个问题是,书中说"不要忘记处理找不到元素的情况"——在这种情况下你会怎么做?在java中,我会返回一个null,但我想这在C++中是不好的(一个nullptr?)?
第二个问题是,为什么它不起作用?我想,如果我找不到它,我只会返回end()-迭代器,因为它在最后一个元素后面一个元素(因此,不指向向量中的元素),但我无法进行比较,当我尝试时,它在每个数字上都会说"找到!"。
#include <vector>
#include <iterator>
#include <iostream>
const std::vector<int>::iterator
search (std::vector<int> v, const int find) {
auto beg = v.begin();
const auto end = v.end();
while (beg != end) {
if (*beg == find) {
return beg;
}
++beg;
}
return beg; // This can only be reached if beg = v.end()?
}
int
main () {
std::vector<int> v;
v.insert(v.end(), 2);
v.insert(v.end(), 5);
v.insert(v.end(), 10);
v.insert(v.end(), 7);
v.insert(v.end(), 12);
for (int i = 0; i < 16; ++i) {
std::vector<int>::iterator b = search(v, i);
std::cout << i;
if (std::distance(b, v.end()) == 0) {
std::cout << " not found!";
} else {
std::cout << " found!";
}
std::cout << std::endl;
}
return 0;
}
输出如下:
$ ./a.exe
0 found!
1 found!
2 found!
3 found!
4 found!
5 found!
6 found!
7 found!
8 found!
9 found!
10 found!
11 found!
12 found!
13 found!
14 found!
15 found!
当您调用函数时,您正在按值传递向量,因此它会生成一个副本。此副本的迭代器将与原始向量中的迭代程序不同,因此比较失败。要解决此问题,请通过常量引用传递矢量:
search( const std::vector<int>& v, const int find )
要回答您的第一个问题,是的,返回end()
迭代器就是指示未找到值的方式。std::find()
就是这样工作的:
如果找不到这样的元素,函数将返回last。
相关文章:
- 反向迭代器在C++中非常奇怪的行为
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++ std::矢量迭代器行为奇怪,不允许增量
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 自定义迭代器:如果 a 和 b 的行为不同,如何正确处理距离计算和相等比较
- 每次循环迭代后递减迭代器都会显示出奇怪的行为
- 原始数组和 std::array 在 clang++ 和 VC++ 上的不同迭代器行为
- 如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中
- 怪异的迭代器行为+带有无序集的segfault
- 在向量和映射上执行擦除(迭代器)时观察到的不同行为
- C 与查找功能一起使用时,迭代器为什么行为会有所不同
- 地图和列表的迭代器显示不同的行为
- 奇怪的自己的迭代器行为与STL的列表相比
- g++4.7.1中奇怪的迭代器行为
- C++迭代器行为在 for vs while 循环中
- C++中非常量列表迭代器的奇怪行为
- 与C++中擦除映射迭代器的行为不一致
- 生成具有迭代器行为的函子
- 为写入指针 API 创建行为良好的迭代器
- 使用具有嵌套向量的迭代器的意外行为