C++ deque容器

deque 用法和 vector 用法差不多,基本上都是一样的!
deque 是一个双端的数组,而vector 是单端的!

例如:
在这里插入图片描述

deque 特点:

  1. deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
  2. deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法)
  3. deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元素或移除元素比较费时。

使用时,包含头文件:#include <deque>


定义
  1. 无参数
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;	// 也可以定义容器类

注意:尖括号内还可以设置指针类型或自定义类型。

  1. 有参数
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();

扫描二维码关注公众号,回复: 9636555 查看本文章

// 获取第一个元素
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的点这里

发布了39 篇原创文章 · 获赞 17 · 访问量 3821

猜你喜欢

转载自blog.csdn.net/cpp_learner/article/details/104638571
今日推荐