方法1:顺序遍历
list与vector不同,不支持随机访问和数组下标访问。
int start = 0, end = 2;//需要交换的两个元素位置 CadEntities *p = CADSHAREDDATA->getCadEntities(); list<list<CadPolyline>>::iterator iter1; list<list<CadPolyline>>::iterator iter2; list<CadPolyline> temp; int k = 0; for (list<list<CadPolyline>>::iterator iter = p->_polylines.begin(); iter != p->_polylines.end(); ++iter, ++k) //遍历 { if (k == start) { iter1 = iter; } if (k == end) { iter2 = iter; } } //交换值 temp = *iter1; *iter1 = *iter2; *iter2 = temp;
方法2:借助迭代器函数
STL 中有用于操作迭代器的三个函数模板,它们是:
advance(p, n):使迭代器 p 向前或向后移动 n 个元素。
distance(p, q):计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。
iter_swap(p, q):用于交换两个迭代器 p、q 指向的值。
#include <list> #include <iostream> #include <algorithm> //要使用操作迭代器的函数模板,需要包含此文件 using namespace std; int main() { int a[5] = { 1, 2, 3, 4, 5 }; list <int> lst(a, a+5); list <int>::iterator p = lst.begin(); advance(p, 2); //p向后移动两个元素,指向3 cout << "1)" << *p << endl; //输出 1)3 advance(p, -1); //p向前移动一个元素,指向2 cout << "2)" << *p << endl; //输出 2)2 list<int>::iterator q = lst.end(); q--; //q 指向 5 cout << "3)" << distance(p, q) << endl; //输出 3)3 iter_swap(p, q); //交换 2 和 5 cout << "4)"; for (p = lst.begin(); p != lst.end(); ++p) cout << *p << " "; return 0; }
程序的输出结果是:
1) 3
2) 2
3) 3
4) 1 5 3 4 2