迭代器在C+中的工作原理+; 我学习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; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; int main() { 名单(10); cout

迭代器在C+中的工作原理+; 我学习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; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; int main() { 名单(10); cout,c++,iterator,C++,Iterator,在第一个循环中,每次迭代将迭代器递增两次(在for语句中递增一次,在循环底部递增一次) 这会导致迭代器跳过其他元素 列表的大小保持不变:100是10,紧随其后的是0。10是列表的大小,0是列表的第一个元素。打印出大小后,打印一个空格或换行,您将自己看到。在这个循环中 for(litr = ilist.begin();litr != ilist.end();litr++,i++) { cout<<"i:"<<i<<" "; //ilist.pus

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

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

列表的大小保持不变:
100
10
,紧随其后的是
0
10
是列表的大小,
0
是列表的第一个元素。打印出大小后,打印一个空格或换行,您将自己看到。

在这个循环中

for(litr = ilist.begin();litr != ilist.end();litr++,i++)
{
    cout<<"i:"<<i<<" ";
    //ilist.push_back(i);
    *litr=i;
    litr++;
}
然后输出将如下所示

10 
i:0 i:1 i:2 i:3 i:4 
10
0 0 1 0 2 0 3 0 4 0
考虑到在header
中声明的几个标准算法可以执行相同的任务。例如,您可以使用算法
std::generate

#include <algorithm>

//...

int i = 0;
std::generate( ilist.begin(), ilist.end(), [&] { return i++; } ); 
#包括
//...
int i=0;
std::generate(ilist.begin(),ilist.end(),[&]{return i++;});

大小没有改变。在第二次循环之前,显示列表的大小,然后显示其内容,不带任何分隔符。由于列表中的第一个元素等于0,因此看起来列表的长度增加到了100。
此外,正如NPE所提到的,在第一个循环中,您将迭代器增加两次。

您将迭代增加两次
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
#include <algorithm>

//...

int i = 0;
std::generate( ilist.begin(), ilist.end(), [&] { return i++; } );