deque 用法和 vector 用法差不多,基本上都是一样的!
deque 是一个双端的数组,而vector 是单端的!
例如:
deque 特点:
- deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
- deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法)
- deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元素或移除元素比较费时。
使用时,包含头文件:#include <deque>
定义
- 无参数
class Student {
public:
Student() {
this->name = new char[10];
strcpy_s(this->name, 10, "无名");
this->age = 0;
}
Student(const char* name, int age) {
this->name = new char[strlen(name) + 1];
strcpy_s(this->name, strlen(name) + 1, name);
}
~Student() {
if (name) {
delete[] name;
name = NULL;
age = 0;
}
}
// 拷贝构造函数
Student(const Student& student) {
this->name = new char[strlen(student.name) + 1];
strcpy_s(this->name, strlen(student.name) + 1, student.name);
this->age = student.age;
}
char* getName() const {
return name;
}
int getAge() const {
return age;
}
private:
char* name;
int age;
};
deque<int> deq1;
deque<float> deq2;
deque<Student> deq3; // 也可以定义容器类
注意:尖括号内还可以设置指针类型或自定义类型。
- 有参数
deque<int> deq4(10);
deque<int> deq5(deq4.begin(), deq4.end());
deque<int> deq6(10, 1);
// 下标方式获取里面的值或赋值
d1.at(0) = 0;
int d = d1[1];
// 头部增加
d1.push_front(1);
// 尾部增加
d1.push_back(2);
// 头部删除
d1.pop_front();
// 尾部删去
d1.pop_back();
// 获取第一个元素
d1.front();
// 获取最后一个元素
d1.back();
// 使用迭代器方式输出
deque<int>::iterator it = d1.begin();
for (; it != d1.end(); it++) {
cout << *it << " ";
}
// 常量迭代器
deque<int>::const_iterator cit = d1.cbegin();
for( ; cit!=d1.cend(); cit++){
cout<<*cit;
cout<<" ";
}
// 逆转的迭代器
deque<int>::reverse_iterator rit=d1.rbegin();
for(; rit!=d1.rend(); ++rit){
cout<<*rit;
cout<<" ";
}
// 第一个迭代器
d1.begin();
// 最后一个迭代的下一个迭代器
d1.end();
// 把d1的全部元素都赋值给d2
d2.assign(d1.begin(), d1.end());
// 给d2赋值6个666
d2.assign(6, 666);
// 调用赋值运算符重载 把d1的全部元素都赋值给d2
d2 = d1;
// 两个容器互换元素
d2.swap(d1);
// 获取容器元素的个数
d1.size();
// 设置容器的长度,如果短了则删去,多了则用0赋值
d1.resize(5);
// 设置容器的长度,多出来的部分用5赋值
d1.resize(15, 5);
// 在d1的开头位置插入一个5
d1.insert(d1.begin(), 5);
// 在d1的第二个位置开始插入两个888
d1.insert(d1.begin() + 1, 2, 888);
// 在第一的开头位置插入d2的所有元素
d1.insert(d1.begin(), d2.begin(), d2.end());
// 删除第二个元素
d1.erase(d1.begin() + 1);
// 删除一个区间的元素
d1.erase(d1.begin() + 1, d1.begin() + 3);
// 删除所有的元素
d1.clear();
// 典型的删除容器里的某个元素,vector也一样
for (deque<int>::iterator it = d1.begin(); it != d1.end();) {
if (*it == 4) {
it = d1.erase(it);
} else {
it++;
}
}
不懂得可以点一下这里!
下面是全部测试代码:
#include <iostream>
#include <Windows.h>
#include <deque>
using namespace std;
class Student {
public:
Student() {
this->name = new char[10];
strcpy_s(this->name, 10, "无名");
this->age = 0;
}
Student(const char* name, int age) {
this->name = new char[strlen(name) + 1];
strcpy_s(this->name, strlen(name) + 1, name);
}
~Student() {
if (name) {
delete[] name;
name = NULL;
age = 0;
}
}
// 拷贝构造函数
Student(const Student& student) {
this->name = new char[strlen(student.name) + 1];
strcpy_s(this->name, strlen(student.name) + 1, student.name);
this->age = student.age;
}
char* getName() const {
return name;
}
int getAge() const {
return age;
}
private:
char* name;
int age;
};
// depue的定义
void text1(void) {
// 无参数定义法
deque<int> deq1;
deque<float> deq2;
deque<Student> deq3;
deq1.push_back(1);
deq1.push_back(2);
// 有参数的定义法
deque<int> deq4(10);
deque<int> deq5(deq1.begin(), deq1.end());
deque<int> deq6(10, 1);
for (int i = 0; i < deq5.size(); i++) {
cout << deq5[i] << endl;
}
}
// 头部尾部增加,头部尾部删去
void text2(void) {
deque<int> deq1;
// 头部增加
deq1.push_front(1);
// 尾部增加
deq1.push_back(2);
// 头部删除
deq1.pop_front();
// 尾部删去
deq1.pop_back();
}
// 元素访问
void text3(void) {
deque<int> deq1(10);
deq1.at(0) = 1;
deq1[1] = 2;
int _front = deq1.front(); // 获取第一个元素
int _bakc = deq1.back(); // 获取最后一个元素
// 迭代器
deque<int>::iterator it = deq1.begin();
for (; it != deq1.end(); it++) {
cout << *it << " ";
}
}
// 赋值
void text4(void) {
deque<int> d1(10, 1);
deque<int> d2;
d2.assign(d1.begin(), d1.end());
// 迭代器
deque<int>::iterator it = d2.begin();
for (; it != d2.end(); it++) {
cout << *it << " ";
}
cout << endl;
d2.assign(6, 666);
it = d2.begin();
for (; it != d2.end(); it++) {
cout << *it << " ";
}
cout << endl;
d2 = d1;
it = d2.begin();
for (; it != d2.end(); it++) {
cout << *it << " ";
}
cout << endl;
deque<int> d3(5, 2);
// 两个容器互换元素
d3.swap(d2);
it = d2.begin();
for (; it != d2.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
// 容器的大小
void text5(void) {
deque<int> d1(10, 1);
d1.size(); // 元素个数
d1.resize(5); // 设置他的长度
d1.resize(15, 5); // 设置他的长度,多出来的部分用5赋值
}
// 插入
void text6(void) {
deque<int> d1(5, 1);
deque<int> d2;
d2.push_back(5);
d2.push_back(6);
d1.insert(d1.begin(), 5); // 在d1的开头位置插入一个5
d1.insert(d1.begin() + 1, 2, 888); // 在d1的第二个位置开始插入两个888
d1.insert(d1.begin(), d2.begin(), d2.end()); // 在第一的开头位置插入d2的所有元素
for (deque<int>::iterator it = d1.begin(); it != d1.end(); it++) {
cout << *it << " ";
}
}
// 删除
void text7(void) {
deque<int> d1;
d1.push_back(1);
d1.push_back(2);
d1.push_back(3);
d1.push_back(4);
d1.push_back(5);
d1.erase(d1.begin() + 1); // 删除第二个元素
d1.erase(d1.begin() + 1, d1.begin() + 3); // 删除一个区间的元素
d1.clear(); // 删除所有的元素
d1.push_back(1);
d1.push_back(2);
d1.push_back(3);
d1.push_back(4);
d1.push_back(5);
for (deque<int>::iterator it = d1.begin(); it != d1.end();) {
if (*it == 4) {
it = d1.erase(it);
} else {
it++;
}
}
for (deque<int>::iterator it = d1.begin(); it != d1.end(); it++) {
cout << *it << " ";
}
}
int main(void) {
//text1();
//text2();
//text3();
//text4();
//text5();
//text6();
//text7();
system("pause");
return 0;
}
总结:
deque用法基本就到这里了,他和vector真的没啥区别,vector中能用的,deque都能用。实际开发中也比较少用到它!
还不懂vector的点这里!