天天看點

C++ list,怎麼交換任意兩個元素的位置?

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

繼續閱讀