当我在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
答案 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