📜  从C++中的不同容器交换子范围(1)

📅  最后修改于: 2023-12-03 15:21:54.786000             🧑  作者: Mango

从C++中的不同容器交换子范围

在C++中,我们经常需要对不同的容器进行操作,其中交换子范围是很常见的一种操作。本文将介绍如何在不同容器之间交换子范围。

1. vector

vector是C++标准库中最常用的容器之一,它支持随机访问,可以在O(1)的时间内访问任何一个元素。下面是vector交换子范围的示例代码:

#include<vector>
#include<iostream>
using namespace std;

int main()
{
    vector<int> v1 = {1,2,3,4,5};
    vector<int> v2 = {6,7,8,9,10};
    vector<int>::iterator iter1 = v1.begin() + 2;
    vector<int>::iterator iter2 = v2.begin() + 2;
    vector<int>::iterator iter3 = v2.begin() + 4;

    v1.swap(vector<int>(iter1, v1.end()));
    v1.insert(v1.end(), iter2, iter3);
    v2.erase(iter2, iter3);

    for (auto it: v1)
        cout << it << " ";
    cout << endl;

    for (auto it: v2)
        cout << it << " ";
    cout << endl;

    return 0;
}

上面代码中,我们首先定义了两个vector,分别是v1和v2,然后我们定义了3个iterator,分别是iter1、iter2和iter3。

接着我们用swap方法将v1中从iter1开始到末尾的所有元素与一个临时vector交换,这样v1中从iter1开始的部分就被移动到了临时vector中。

接着我们使用insert方法将v2中从iter2到iter3的部分插入到了v1的末尾。

最后我们使用erase方法将v2中从iter2到iter3的部分删除掉。

最后输出v1和v2的元素值。

2. list

list也是C++标准库中常用的容器之一,它支持双向迭代,可以在O(1)的时间内在任何位置插入或删除元素。下面是一个示例代码:

#include<list>
#include<iostream>
using namespace std;

int main()
{
    list<int> l1 = {1,2,3,4,5};
    list<int> l2 = {6,7,8,9,10};
    list<int>::iterator iter1 = l1.begin();
    list<int>::iterator iter2 = l2.begin();
    advance(iter1, 2);
    advance(iter2, 2);
    list<int>::iterator iter3 = iter2;
    advance(iter3, 2);

    l1.splice(l1.end(), l2, iter2, iter3);
    auto iter4 = l1.begin();
    advance(iter4, 2);
    l1.erase(iter1, iter4);

    for (auto it: l1)
        cout << it << " ";
    cout << endl;

    for (auto it: l2)
        cout << it << " ";
    cout << endl;

    return 0;
}

上面代码中,我们首先定义了两个list,分别是l1和l2,然后我们定义了3个iterator,分别是iter1、iter2和iter3。

我们使用advance方法将iter1和iter2分别向后移动两个位置,从而指向了l1和l2中的第3个元素。

然后我们又使用advance方法将iter3向后移动了两个位置,从而指向了l2中的第5个元素。

接着我们使用splice方法将l2中从iter2到iter3的元素插入到了l1的末尾。

最后我们使用erase方法将l1中从iter1到iter4的元素删除掉,其中iter4指向了l1中的第4个元素。

最后输出l1和l2的元素值。

3. deque

deque也是C++标准库中常用的容器之一,它是一个双端队列,可以在头部和尾部进行插入和删除操作。下面是一个示例代码:

#include<deque>
#include<iostream>
using namespace std;

int main()
{
    deque<int> d1 = {1,2,3,4,5};
    deque<int> d2 = {6,7,8,9,10};
    deque<int>::iterator iter1 = d1.begin() + 2;
    deque<int>::iterator iter2 = d2.begin() + 2;
    deque<int>::iterator iter3 = d2.begin() + 4;

    d1.swap(deque<int>(iter1, d1.end()));
    d1.insert(d1.end(), iter2, iter3);
    d2.erase(iter2, iter3);

    for (auto it: d1)
        cout << it << " ";
    cout << endl;

    for (auto it: d2)
        cout << it << " ";
    cout << endl;

    return 0;
}

上面代码中,我们首先定义了两个deque,分别是d1和d2,然后我们定义了3个iterator,分别是iter1、iter2和iter3。

我们使用swap方法将d1中从iter1到末尾的所有元素与一个临时deque交换,这样d1中从iter1开始的部分就被移动到了临时deque中。

然后我们使用insert方法将d2中从iter2到iter3的部分插入到d1的末尾。

最后我们使用erase方法将d2中从iter2到iter3的部分删除掉。

最后输出d1和d2的元素值。

总结

交换子范围是C++中常见的一种操作,能够帮助我们在不同的容器之间移动元素。在本文中,我们介绍了如何在vector、list和deque中进行交换子范围的操作。通过这些示例代码,我们可以更好地理解和掌握这些容器的操作方法。