为什么迭代器没有到达向量末端?
why iterator doesnt get to end of vector?
我做了一个向量v
,它是[-5,-3]。我将一个迭代器iti
分配给它的开头,然后将另一个迭代器itj
分配为iti+1
。由于我的向量只有 2 个元素,我认为itj
被认为是向量的末尾或v.end()
。但事实并非如此。
任何想法为什么会发生这种情况?
vector<int>v;
v.push_back(-5);
v.push_back(-3);
vector<int>::iterator iti, itj;
iti = v.begin();
itj = iti + 1;
if(itj==v.end())
cout << "1";
else
cout << "2";
为什么这会打印出"2"而不是"1"?
end
是最后一个元素之后(不存在的(元素的迭代器。iti + 2
等于end
,因为向量有 2 个元素。通常,对于大小为N
的向量:begin + N
等于end
。
vector:: end()
的定义是,它返回迭代器,该迭代器指向最后一个元素旁边的(虚构(元素。
现在,这最初可能看起来很愚蠢,但实际上非常有用,因为通常您使用迭代器来迭代向量。这通常是使用 for 循环完成的。所以人们这样做
for (vector<int>:: iterator i = v.begin();i!=v.end();i++)
它迭代整个向量。
现在我并不是说如果end
将迭代器返回到最后一个元素,我们就无法实现这一点。当然,如果我们稍微改变一下循环的结构,这是可能的。
因此,让我们暂时假设end
确实返回了一个指向最后一个元素的迭代器。现在尝试编写一段代码来迭代整个向量,比如打印它。您将了解为什么设计师选择这种约定。请记住,您不能像比较普通整数索引那样将两个迭代器与<=
进行比较。
顺便说一句,所有 STL 容器都是相同的约定。
相关文章:
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 如何取消引用向量迭代器
- Map中的(字符串的)向量迭代器
- C++将向量迭代器转换为索引
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++向量迭代器nth_element编译错误
- 无法查找值初始化的向量迭代器?
- STD ::向量迭代器类型和允许的操作
- 向量迭代器 < 或 !=
- 向量迭代器在新对象的 push_back() 之后不兼容
- 向量迭代器对于包装器类不可取消引用(没有超出 end() 取消引用)
- C++向量迭代器不是增量的
- 使用向量迭代器的合并矢量
- 向量迭代器不可递增
- 向量迭代器进行循环
- 向量迭代器与c++不兼容
- 向量迭代器不可解引用C++
- C++将向量迭代器与实例进行比较
- 编译错误 ::向量 ::迭代器