我正在学习C ++中的容器,并尝试在迭代器的帮助下插入和打印列表元素。我得到了与我的期望不同的输出。
#include<iostream>
#include<list>
#include<vector>
#include<deque>
#include<string>
using namespace std;
int main()
{
list<int> ilist(10);
cout<<ilist.size()<<endl;
list<int>::iterator litr = ilist.begin();
int i =0;
for(litr = ilist.begin();litr != ilist.end();litr++,i++)
{
cout<<"i:"<<i<<" ";
//ilist.push_back(i);
*litr=i;
litr++;
}
litr = ilist.begin();
cout<<endl;
cout<<ilist.size();
while(litr != ilist.end())
{
i=*litr;
cout<<i<<endl;
litr++;
}
return 0;
}
输出: 10 i:0 i:1 i:2 i:3 i:4 100 0 1 0 2 0 3 0 4 0
为什么在插入元素后尺寸发生了变化以及为什么元素没有正确插入?
提前致谢。
答案 0 :(得分:2)
在第一个循环中,每次迭代都会递增两次迭代器(一次在for
语句中,一次在循环的底部)。
这会导致迭代器跳过其他所有元素。
列表的大小保持不变:100
10
后紧跟0
。 10
是列表的大小,0
是列表的第一个元素。打印出尺寸后打印一个空格或换行符,你会亲眼看到。
答案 1 :(得分:0)
在这个循环中
for(litr = ilist.begin();litr != ilist.end();litr++,i++)
{
cout<<"i:"<<i<<" ";
//ilist.push_back(i);
*litr=i;
litr++;
}
你正在增加iterator litr两次:在控制语句中和循环体内。 它可以写得更简单
list<int>::iterator litr;
int i = 0;
for ( litr = ilist.begin(); litr != ilist.end(); litr++, i++ )
{
cout<<"i:"<<i<<" ";
*litr = i;
}
或者
list<int>::iterator litr;
int i = 0;
for ( litr = ilist.begin(); litr != ilist.end(); litr++ )
{
cout<<"i:"<<i<<" ";
*litr = i++;
}
至于输出,那么在第二次打印尺寸后需要插入std::endl
会更清楚。例如
cout<<ilist.size() << endl;
// ^^^^^^^
while(litr != ilist.end())
{
i=*litr;
cout<<i<<endl;
litr++;
}
然后输出看起来像
10
i:0 i:1 i:2 i:3 i:4
10
0 0 1 0 2 0 3 0 4 0
考虑到标题<algorithm>
中声明的几种标准算法可以执行相同的任务。例如,您可以使用算法std::generate
。
#include <algorithm>
//...
int i = 0;
std::generate( ilist.begin(), ilist.end(), [&] { return i++; } );
答案 2 :(得分:0)
尺寸没有改变。在第二个循环之前,您将显示列表的大小,然后显示其内容,而不显示任何分隔符。由于列表中的第一个元素等于0,因此看起来列表的长度变为100。 另外,就像NPE提到的那样,在第一个循环中,你将迭代器增加两次。