迭代器 begin() 应该包含 3,输出是 2? [关闭]

Posted

技术标签:

【中文标题】迭代器 begin() 应该包含 3,输出是 2? [关闭]【英文标题】:Iterator begin() should contain 3, output says 2? [closed] 【发布时间】:2015-12-03 18:24:00 【问题描述】:

为什么指向列表开头的迭代器输出第二个值?为什么 a.begin()++ 将 begin() 提前,有更好的实现方式吗?

#include <iostream>
#include <list>
using namespace std;
//3,2,1
int main() 
    list<int> a;
    a.insert(a.begin(),1);              
    cout << *(a.begin()) << endl;
    a.insert(a.begin(),3);
    cout << *a.begin()<< endl;
    a.insert(a.begin()++,2);
    list<int>::iterator iterator = a.begin();
    iterator++;
    cout << *iterator << endl;
        return 0;

我的输出:

1
3
3

预期输出:

1
3
2

编辑: “因为您将 2 放在列表的开头。请记住,a.begin()++ 正在执行后递增,即,它在所有其他操作之后递增。使用 ++a.begin() 尝试您的代码,看看它是否做你所期望的”-@Ben

排版错误,谢谢 Ben。

【问题讨论】:

我使用 gcc 和 VS 编译器得到了你预期的输出。 如果您使用 ++it 而不是 it++(即前缀增量运算符),这就是我所期望的行为。也许后缀运算符的实现存在错误? distance(a.begin(), a.begin()++) 是什么? @ateneaMinerva 如果确实如此,那么它可能是库的错误。 等待:您的主题说“输出包含 2”,这就是您声称的预期输出!?哪个是对的? In your last edit,很明显你的输出是应该的,因为你已经将iterator 推进到包含2 的元素之后。我投票结束这个问题。 【参考方案1】:

代码没问题:

#include <iostream>
#include <list>
using namespace std;
//3,2,1
int main() 
    list<int> a;
    a.insert(a.begin(),1);
    cout << *(a.begin()) << endl;
    a.insert(a.begin(),3);
    cout << *a.begin()<< endl;
    a.insert(a.begin()++,2);
    list<int>::iterator iterator = a.begin();
    cout << *iterator << endl;
    return 0;

输出:

1
3
2

也请访问Ideone。

【讨论】:

【参考方案2】:

看起来这只是忘记了a.insert(a.begin()++,2); 在这种情况下等同于a.insert(a.begin(), 2)。这是因为 post-increment 会将 2 添加到列表的开头,然后递增迭代器。如果您想要预期的输出,那么您将需要使用预增量运算符。即:

a.insert(++a.begin(), 2)

【讨论】:

很好地抓住了本,我没想到他会错过,+1!

以上是关于迭代器 begin() 应该包含 3,输出是 2? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

3.4迭代器介绍

减去 X.begin() 如何返回迭代器的索引?

课时10:迭代器迭代器失效分析

begin() 是一个有效的迭代器操作,如果是,它指的是啥?

连续迭代器上的 SIMD 指令

OJ多项式加法