list<int> l;
for (int i = 0; i < 10; i++) {
int x;
cin >> x;
l.push_front(x);
}
//将列表容器l的每相邻两个元素顺序颠倒
list<int>::iterator iter = l.begin();/*l.begin()返回的是指向l首元素地址的迭代器并将其赋值给iter,所以iter也要是迭代器,所以初始化iter前面要加“list<int>::iterator”*/
while (iter != l.end()) {
int v = *iter; //得到一个元素
iter = l.erase(iter); /*将该元素删除,并得到指向下一个元素的迭代器,因为list是链表容器,所以删除一个节点,相当于节点后面的节点全部“前移”*/
l.insert(++iter, v);//将刚刚删除的元素(节点)插入下一个位置,返回的是指向插入节点后的节点的迭代器
}
生成list容器对象l,然后对l的每相邻两个元素顺序颠倒,比如原来l中的元素是“1 2 3 4 5 6 7 8 9 10”,颠倒之后是“2 1 4 3 6 5 8 7 10 9”。
一步步对while循环进行分析:
写在前面:list是链表容器!一开始笔者把list以为成数组容器,所以对代码百思不得其解。链表的特点是节点与节点之间不是物理内存上的连续储存,节点之间以指针相联系,所以在顺序颠倒的操作中,可以自如地删除节点、插入节点。
l.end()返回的是指向l最后节点之后的迭代器;
l.erase(iter)指删除iter指向的节点,并将下一个节点的地址返回,例如一开始删除数据为1的节点,返回数据为2的节点的地址;
iter = l.erase(iter),将数据为2的节点的地址赋给iter;
l.insert(++iter, v)指用v初始化一个新节点,并插入到++iter指向的节点之前,即数据为3的节点之前。并将(已插入的节点的)下一个节点的地址返回,即返回的是数据为3的节点的地址;
因为返回的是数据为3的节点的地址,所以while循环便可以顺利进行下去。