STD ::在C 中的进步不能正确地行为

std::advance in c++ do not behave correctly

本文关键字:不能 正确地 STD      更新时间:2023-10-16

当我在C 中使用std :: list时,我使用std :: Advance at 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

您在将任何内容添加到列表中之前要获得迭代器。线

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