迭代器 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? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章