【问题标题】:why iterator doesnt get to end of vector?为什么迭代器没有到达向量的末尾?
【发布时间】:2020-09-09 09:59:01
【问题描述】:

我创建了一个向量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 == v.end() 是真的。

标签: c++ pointers vector iterator


【解决方案1】:

vector:: end() 的定义是这样定义的,它返回指向最后一个元素旁边的(假想的)元素的迭代器。

现在,这最初可能看起来很愚蠢,但实际上非常有用,因为通常您使用迭代器来迭代向量。这通常使用 for 循环来完成。所以人们会这样做

for (vector<int>:: iterator i = v.begin();i!=v.end();i++)

遍历整个向量。

现在我并不是说如果end 返回一个指向最后一个元素的迭代器,我们就无法实现这一点。如果我们稍微改变一下循环的结构,当然可以做到这一点。

所以,让我们暂时假设end 确实返回了一个指向最后一个元素的迭代器。现在尝试编写一段代码来迭代整个向量,比如打印它。你会明白为什么设计师选择了这种约定。请记住,您不能像使用普通整数索引那样将两个迭代器与 &lt;= 进行比较。

顺便说一句,所有 STL 容器都采用相同的约定。

【讨论】:

    【解决方案2】:

    end 是最后一个元素之后的(不存在的)元素的迭代器。 iti + 2 将等于 end 因为向量有 2 个元素。一般来说,对于大小为N 的向量:begin + N 等于end

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2021-08-17
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多