📅  最后修改于: 2023-12-03 15:21:54.786000             🧑  作者: Mango
在C++中,我们经常需要对不同的容器进行操作,其中交换子范围是很常见的一种操作。本文将介绍如何在不同容器之间交换子范围。
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的元素值。
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的元素值。
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中进行交换子范围的操作。通过这些示例代码,我们可以更好地理解和掌握这些容器的操作方法。