std :: advance在C++中表现不正确
问题描述:
虽然我在C++中调用了std :: list,但我使用std :: advance来随机访问元素。但是std :: advance并不像预期的那样工作。如下所示。std :: advance在C++中表现不正确
#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
答
你所得到的迭代器之前,您已经添加任何东西到列表中。该生产线
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