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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值