目录
deque模板介绍:
deque特点:
deque内存结构图解:
deque各操作地址指向:
deque的成员函数:
deque构造函数:
代码实例:
运行结果:
deque赋值函数:
实例:
运行结果:
deque判断函数
运行结果:
deque的删除和插入:
代码示例:
运行结果:
deque数据存取函数:
代码实例:
运行结果:
结束!
deque是C++ STL中的一个双端队列模板,它支持在队列的两端进行元素的插入和删除操作。deque的全称是double-ended queue,即双向队列。deque的特点是可以高效地在队列的两端进行元素的插入和删除操作,而且可以在任意位置进行元素的访问和修改操作。
1.支持迭代器:可以用迭代器随机访问容器中的元素。
2.插入和删除:可以在队头和队尾进行自由的删除和插入,但是在中间插入或删除的时候效率比较慢,这是由于deque的内存结构决定的,我们会在下文进行解释。
3.内存管理:deque使用一段连续的存储空间,但是它可以使用多个缓冲区存储元素,每一个缓冲区的大小可以不一样。
4.在C++17之前的标准中,deque是不支持元素的拷贝和移动操作的,这是因为他的元素存储在不同的缓冲区中,而不是连续存储的,拷贝和移动可能会导致内存布局的变化,从而破坏deque的数据结构,C++17之后就移除了这一特性。
deque内部有一个中控器,维护缓冲区地址,而缓冲区存放真实数据,中控器维护的是每一个缓冲区的地址,使得使用deque时像一片连续的空间。
这也是为什么我们区间赋值永远不包含end()的原因:end()指向的是最后一个元素的后一个位置!
1.默认构造函数:deque
dequed1;
2.将[beg,end)区间的元素拷贝给自身:deque (beg,end);
dequed2(d1.begin(), d1.end());
3.将n个ele拷贝给自身:deque(n,elem);
dequed3(3, 8);
4.拷贝另一个容器给自身:deque(const deque &deq);
dequed4(d3);
#include
using namespace std;
#include
void print(deque&d)
{
for (deque::iterator it =d.begin();it!=d.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//默认构造
dequed1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
cout << "默认构造:" << endl;
print(d1);
//区间构造
dequed2(d1.begin(), d1.end());
cout << "区间构造:" << endl;
print(d2);
//n个elem构造
dequed3(3, 8);
cout << "n个ele构造:" << endl;
print(d3);
//拷贝构造
dequed4(d3);
cout << "拷贝构造:" << endl;
print(d4);
}
int main()
{
test01();
}
1.将n个ele赋值给自身:assign(n,ele);
dequed1;
d1.assign(8, 10);
2.将[beg,end)的元素拷贝赋值给自身:assign(beg,end)
dequed2;
d2.assign(d1.begin(), d1.end());
3.重载等号运算符:deque &operator=const deque &deq
dequed3 = d1;
#include
using namespace std;
#include
void print(deque& d)
{
for (deque::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//将n个elem元素赋值给自身
dequed1;
d1.assign(8, 10);
cout << "n个elem赋值结果为:";
print(d1);
//将beg,end中的数据赋值给自身
dequed2;
d2.assign(d1.begin(), d1.end());
cout << "区间赋值结果为:";
print(d2);
//重载等号运算符
dequed3 = d1;
cout << "重载等号赋值结果为:";
print(d3);
}
int main()
{
test01();
}
1.判断容器是否为空:empty();
2.判断容器中元素个数:size();
3重新指定容器长度为num,如果容器变长,则变长部分用默认值填充新位置,如果容器变小就删除多出元素:resize(num);
4.重新指定容器的长度为num。若容器变长,就以ele值填充新位置,若容器变短,则超出的元素被删除:resize(num,elem);
#include
using namespace std;
#include
void print(deque& d)
{
for (deque::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//将n个elem元素赋值给自身
dequed1;
d1.assign(8, 10);
print(d1);
cout << "d1容器是否为空(1为空 0为不空):" << d1.empty()<
两端插入
1.在尾部添加一个数据:push_back();
2.在容器头部添加一个数据:push_front();
3.删除容器中最后一个元素:pop_back();
4.删除容器中第一个数据:pop_front();
指定位置插入
1. 在pos位置插入一个ele元素,返回新数据的位置: insert (pos,elem)
2. 在pos位置插入n个elem元素,无返回值: insert(pos,n,elem)
3. 在pos位置插入[beg,end)区间的数据,无返回值: insert(pos,beg,end)
4. 清空容器的所有数据: clear() ;
5. 删除从beg到end的所有元素: eares(beg,end);
6.删除pos位置的元素,返回下一个数据的位置: eares pos
#include
using namespace std;
#include
void print(deque& d)
{
for (deque::iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
dequed(2,7 );
dequed1;
d1.assign(8, 10);
print(d1);
d1.push_back(1);
d1.push_front(2);
cout << "插入后";
print(d1);
d1.pop_back();
d1.pop_front();
cout << "删除后";
print(d1);
d1.insert(d1.begin(), 8);
print(d1);
d1.insert(d1.begin(), 2, 9);
print(d1);
d1.insert(d1.begin(), d.begin(), d.end());
print(d1);
d1.erase(d1.begin());
print(d1);
d1.erase(d1.begin(), d1.end());
print(d1);
d.clear();
cout << "d的元素为:";
}
int main()
{
test01();
}
1.获取容器中第dex+1个元素:at(int dex);
2.获取容器中第dex+1个元素:operator[dex];
3.获取容器中第一个元素:front();
4.获取容器中最后一个元素:back();
#include
using namespace std;
#include
void print(deque&d)
{
for (deque::iterator it =d.begin();it!=d.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//默认构造
dequed1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
print(d1);
cout << d1.at(4)<