c ++中的std :: advance行为不正确

时间:2017-06-03 06:45:35

标签: c++ c++11 stdlist

当我在c ++中使用std :: list进行调整时,我使用std :: advance来随机访问元素。但是std :: advance没有按预期工作。代码如下所示。

#include <list>
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
list<int> i;
typename list<int>::iterator t=i.begin();
i.push_front(0);
i.push_back(1);
i.push_back(2);
i.push_back(3);
cout<<*t<<" ";
advance(t,1);
cout<<*t<<" ";
advance(t,2);
cout<<*t<<" ";
}

我得到的输出是0 0 2 但输出不应该是0 1 3

1 个答案:

答案 0 :(得分:2)

在向列表中添加任何内容之前,您将获得迭代器。这条线

typename list<int>::iterator t=i.begin();

相当于

typename list<int>::iterator t=i.end();
即使您将项目添加到列表后,

t仍继续指向列表的末尾。因此,第一行尝试取消引用迭代器

cout<<*t<<" "

导致未定义的行为。之后会发生任何事情。在此之后尝试理解程序的输出是没有意义的。

要解决此问题,您应在将项目添加到列表后获取迭代器。

#include <list>
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
   list<int> i;
   i.push_front(0);
   i.push_back(1);
   i.push_back(2);
   i.push_back(3);
   typename list<int>::iterator t=i.begin();
   cout<<*t<<" ";
   advance(t,1);
   cout<<*t<<" ";
   advance(t,2);
   cout<<*t<<" ";
}

输出:

0 1 3