方法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