为什么迭代器没有到达向量末端?

why iterator doesnt get to end of vector?

本文关键字:向量 迭代器 为什么      更新时间:2023-10-16

我做了一个向量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 容器都是相同的约定。