deque插入和删除
功能描述:
向deque容器中插入和删除数据
函数原型:
两端插入操作:
push_back(elem); //在容器尾部添加一个数据
push_front(elem); //在容器头部插入一个数据
pop_back(); //删除容器最后一个数据
pop_front(); //删除容器第一个数据
指定位置操作:
insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
clear(); //清空容器的所有数据
erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos); //删除pos位置的数据,返回下一个数据的位置。
#include<iostream>
using namespace std;
#include<deque>
//deque容器插入和删除
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//两端操作
void test01()
{
deque<int>d1;
//尾插
d1.push_back(10);
d1.push_back(20);
//头插
d1.push_front(30);
d1.push_front(40);
printDeque(d1);
//尾删
d1.pop_back();
printDeque(d1);
//头删
d1.pop_front();
printDeque(d1);
}
void test02()
{
deque<int>d1;
d1.push_back(10);
d1.push_back(20);
d1.push_front(30);
d1.push_front(40);
printDeque(d1);
//insert插入
d1.insert(d1.begin(), 80);
printDeque(d1);
d1.insert(d1.begin(),2, 90);
printDeque(d1);
//按照区间进行插入
deque<int>d2;
d2.push_back(1);
d2.push_back(2);
d2.push_front(3);
d1.insert(d1.begin(), d2.begin(), d2.end());
printDeque(d1);
}
void test03()
{
deque<int>d1;
d1.push_back(10);
d1.push_back(20);
d1.push_front(30);
d1.push_front(40);
printDeque(d1);
//删除
deque<int>::iterator it = d1.begin();
it++;
d1.erase(it);
printDeque(d1);
//按区间方式删除
d1.erase(d1.begin(), d1.end());
//d1.clear();
printDeque(d1);
}
int main()
{
test01();
cout << endl;
test02();
cout << endl;
test03();
return 0;
}
这里有个坑需要避一下,就是当重复执行d1.erase(it);后程序运行会崩溃。
崩溃的原因是在执行d1.erase(it)之后,迭代器it失效了,不能再继续使用。在C++的STL中,当执行erase操作后,如果要继续使用迭代器进行遍历或删除元素,需要重新获取合法的迭代器。因此,连续两次执行d1.erase(it)会导致第二次的删除操作使用了一个已经无效的迭代器,从而产生错误。
要解决这个问题,可以在执行d1.erase(it)之后,重新获取合法的迭代器,再进行下一次的删除操作。以下是修改后的代码:
// 删除
deque<int>::iterator it = d1.begin();
it++;
d1.erase(it);
// 重新获取合法的迭代器
it = d1.begin();
it++;
d1.erase(it);
printDeque(d1);
这样修改后,就不会报错了。
总结:
插入和删除提供的位置是迭代器!
尾插-push_back
尾删-pop_back
头插-push_front
头删-pop_front
deque数据存取
功能描述:
对deque中的数据的存取操作
函数原型:
at(int idx); //返回索引idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<deque>
//deque容器数据存取
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
deque<int>d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_front(40);
d.push_front(50);
d.push_front(60);
//通过[]方式访问元素
for (int i = 0; i < d.size(); i++)
{
cout << d[i] << " ";
}
cout << endl;
//通过at方式访问元素
for (int i = 0; i < d.size(); i++)
{
cout << d.at(i) << " ";
}
cout << endl;
cout << "第一个元素为:" << d.front() << endl;
cout << "最后一个元素:" << d.back() << endl;
}
int main()
{
test01();
return 0;
}
总结:
除了用迭代器获取deque容器中元素,[]和at也可以
front返回容器第一个元素
back返回容器最后一个元素
deque排序
功能描述:
利用算法实现对deque容器进行排序
算法:
sort(iterator beg,iterator end) //对beg和end区间内元素进行排序
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
#include<vector>
//deque容器排序
void printDeque(const deque<int>&d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
deque<int>d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_front(40);
d.push_front(50);
d.push_front(60);
printDeque(d);
//排序
deque<int>::iterator it1 = d.begin();
++it1;
deque<int>::iterator it2 = d.end();
--it2;
cout << "排序后:" << endl;
sort(it1, it2);
printDeque(d);
cout << "vector排序:" << endl;
vector<int>v;
v.push_back(5);
v.push_back(2);
v.push_back(4);
v.push_back(7);
sort(v.begin(), v.end());
for (vector<int>::const_iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
return 0;
}
对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序,vector容器也可以利用sort进行排序。