该容器以一个具体的程序进行演示讲解
#include<deque> 需要包含该头文件
template <typename T>
void print(T Begin, T end) 自行定义一个遍历打印的模板函数后续判断迭代器是否可以利用
{
for (T i = Begin; i != end; ++i)
{
std::cout << *i << std::endl;
}
std::cout << std::endl;
}
int main()
{
std::deque<int> obja(5); 声明一个int类型五个元素初始化为0的队列,内存不连续,obja为迭代器
若std::deque<int> obja(5,12138); 声明一个int类型五个元素为12138队列
for (size_t i = 0; i < obja.size(); i++) 初始化队列
{
obja[i] = i; 因为其具有迭代器,可以直接以数组方式进行赋值
}
std::cout << obja.size() << std::endl; 输出队列大小
std::deque<int> objb(obja); 拷贝构造
std::cout << objb.size() << std::endl;
objb[3] = 15; 下标3元素赋值3
objb.at(0) = 0; 下标0元素赋值0
队列容器的迭代器是随机访问迭代器,此下研究该迭代器
该迭代器具有以下操作符功能++ -- += -= = - * []
std::cout << typeid(std::deque<int> (int类型deque容器)::iterator (迭代器)::iterator_category (迭代器类型)).name() << std::endl;
查看迭代器类型,是随机访问迭代器,
auto objc = objb.begin(); begin()返回值本质上就是一个迭代器
std::cout << typeid(objc).name() << std::endl;
查看发现objc类型为一个迭代器,类型如下:
class std::_Deque_iterator<classstd::_Deque_val<structstd::_Deque_simple_types<int> > >
std::cout << *objc << std::endl; 取该objc值打印为0,说明objc是迭代器
auto it = obja.begin(); 设置一个变量用于遍历该容器
for (size_t i = 0; i < obja.size(); i++) 遍历打印
{
std::cout << *it++ << std::endl; 打印0 1 2 3 4 5
}
for(auto i = obja.begin(); i != obja.end(); i++) 效果同上一致
{
std::cout << *i << std::endl;
}
for(auto i = obja.rbegin(); i != obja.rend(); i++) 反向迭代器应用
{
std::cout << *i << std::endl;
}
obja.push_back(5); 尾部插入5
obja.push_front(6); 头部插入6
obja.insert(obja.begin() + 3, 222); 第四个位置插入22,即任意位置插入
obja.pop_back();尾部元素弹出
obja.pop_front(); 头部元素弹出
obja.erase(obja.end() - 1); 任意位置弹出
obja.clear(); 队列元素清空
crbegin r反向迭代器 c是const 组合是常量反向迭代器,crbegin意思是对rbegin做了一个const的修饰
std::cout << obja.size() << std::endl;打印该容器长度也可判断该容器是否为空
print(obja.begin(), obja.end()); 可以利用之前定义模板函数遍历打印
system("pause");
return 0;
}