Iterator如何在C ++中工作

时间:2014-09-29 06:34:48

标签: c++ iterator

我正在学习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

为什么在插入元素后尺寸发生了变化以及为什么元素没有正确插入?

提前致谢。

3 个答案:

答案 0 :(得分:2)

在第一个循环中,每次迭代都会递增两次迭代器(一次在for语句中,一次在循环的底部)。

这会导致迭代器跳过其他所有元素。

列表的大小保持不变:100 10后紧跟010是列表的大小,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提到的那样,在第一个循环中,你将迭代器增加两次。