STL deque容器的简单认识
- deque容器的基本概念
- deque和vector的区别
- deque内部工作原理:
- deque容器构造函数
- deque容器赋值操作
- deque容器大小操作
- deque容器插入和删除
- deque容器数据存取
- deque容器排序操作
deque容器的基本概念
功能:双端数组,可以对头端进行插入删除操作
deque和vector的区别
- vector 对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度会比vector快
- vector访问元素时的速度会比deque快,这和两者的内部实现有关
deque内部工作原理:
deque内部有一个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
deque迭代器也是支持随机访问的
deque容器构造函数
deque<T> deq;
默认构造函数
deque<string> deq;
deque(bug, end);
构造函数将[beg, end)区间中的元素拷贝给本身
deque<string> deq;
deque<string> deq_copy(deq.begin(), deq.end());
deque(n, elem);
构造函数将n个elem拷贝给本身
deque<string> deq(3, 10);
deque(const deque& dep);
拷贝构造函数
deque<string> deq;
deque<string> deq_copy(deq);
deque容器赋值操作
deque& operator=(const deque& deq);
重载等号运算符
deque<int> deq;
for (int i = 0; i < 10; i++)
{
deq.push_back(i);
}
print(deq);
deque<int> deq_2 = deq;
print(deq_2);
assign(beg, end);
将[beg, end) 区间内的数据拷贝赋值给本身
deque<int> deq;
for (int i = 0; i < 10; i++)
{
deq.push_back(i);
}
print(deq);
deque<int> deq_2;
deq_2.assign(deq.begin(), deq.end());
print(deq_2);
assign(n, elem);
将n个elem拷贝赋值给本身
deque<int> deq;
deq.assign(10, 8);
print(deq);
deque容器大小操作
deque.empty();
判断容器是否为空
deque<int> deq;
deq.assign(10, 8);
std::cout << "deq 是否为空" << deq.empty() << std::endl;
deque.size();
返回容器中元素的个数
deque<int> deq;
deq.assign(10, 8);
std::cout << "deq 大小" << deq.size() << std::endl;
deque.resize();
更新指定容器的长度num, 若容器变长,则以默认值填充新位置,若容器变短,则超出末尾的长度的元素将被删除
deque<int> deq;
deq.assign(10, 8);
deq.resize(5);
print(deq);
deque.resize(num, elem);
重新指定容器的长度num,若容器变长将以elem值填充新位置,如果容器变短,末尾超出部分将被删除
deque<int> deq;
deq.assign(10, 8);
deq.resize(15, 2);
print(deq);
deque容器插入和删除
push_back(elem);
在容器尾部添加一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
deq.push_back(i);
}
print(deq);
push_front(elem);
在容器头部插入一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
deq.push_front(i);
}
print(deq);
pop_back();
删除容器最后一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
deq.push_front(i);
}
deq.pop_back();
print(deq);
pop_front();
删除容器第一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
deq.push_front(i);
}
deq.pop_front();
print(deq);
insert(pos, elem);
在pos位置插入一个elem元素的拷贝,返回新数据的位置
deque<int> deq;
deque<int>::iterator it = deq.insert(deq.begin(), 12);
std::cout << *it << std::endl;
print(deq);
insert(pos, n, elem);
在pos位置插入n个elem的元素,无返回值
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
print(deq);
insert(pos, deb, end);
在pos位置插入[beg, end) 区间的数据,无返回值
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
print(deq);
deque<int> deq_2;
deq_2.insert(deq_2.begin(), deq.begin(), deq.end());
print(deq_2);
clear();
清空容器的所有操作
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
print(deq);
deq.clear();
print(deq);
erase(beg, end);
删除[beg, end)区间的数据,返回下一个数据的位置
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
deq.erase(deq.begin(), deq.end());
print(deq);
erase(pos);
删除pos位置的数据,返回下一个数据的位置
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
deq.erase(deq.begin());
print(deq);
deque容器数据存取
at(int idx);
返回索引idx所指的数据
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.at(1) << std::endl;
operator[];
返回索引idx所指的数据
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq[1] << std::endl;
front();
返回容器中的第一个元素
在deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.font() << std::endl;
back();
返回容器中最后一个元素
在deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.back() << std::endl;
deque容器排序操作
sort(iterator beg, iterator end);
对beg和end区间内的元素进行排序
默认排序是从小到大,即升序排列
#include <iostream>
#include <deque>
#include <ctime>
#include <algorithm>
using namespace std;
void print(const deque<int>& deq)
{
//const_iterator
for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
srand((unsigned int)time(NULL));
deque<int> deq;
for (int i = 0; i < 10; i++)
{
int num = rand() % 60 + 40;
deq.push_back(num);
}
std::cout << "排序前:" << std::endl;
print(deq);
sort(deq.begin(), deq.end());
std::cout << "排序后:" << std::endl;
print(deq);
}
实际上,对于支持随机访问的迭代器,都可以利用sort算法进行排序,vector也可以使用sort排序