C++学习笔记(二十四)

这篇博客详细介绍了C++中的vector和deque容器,包括它们的基本概念、构造函数、赋值操作、容量与大小、插入与删除、数据存取、互换容器、预留空间以及排序操作。此外,还探讨了deque作为双端数组的特性,如头部插入删除的高效性。通过实例代码展示了这些操作的用法。
摘要由CSDN通过智能技术生成

在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第二十四篇博客。

本篇博客介绍了C++的vector容器和deque容器。

本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

目录

vector容器

vector基本概念

vector构造函数

vector赋值操作

vector容量和大小

vector插入和删除

vector数据存取

vector互换容器

vector预留空间

deque容器

deque基本概念

deque构造函数

deque赋值操作

deque大小操作

deque插入和删除

deque数据存取

排序操作


vector容器

vector基本概念

vector容器数据结构和数组很相似,也称为单端数组。但是数组是静态空间,vector可以动态扩展。动态扩展不是在原空间后续接新空间,而是找更大的内存空间,然后将原数据拷贝至新空间。

vector容器的迭代器支持随机访问。

vector构造函数

使用vector容器需要包含vector头文件。

vector<T> v创建一个vector容器,存放T类型数据,容器名称为v。

vector(v.begin(),v.end())将v.begin()到v.end()之间的元素拷贝给本身。

vector(n,elem)将n个elem拷贝给本身。

vector(const vector &vec)是拷贝构造函数。

vector容器名.begin()是开始位置,vector容器名.end()是结束位置。

vector<T>::iterator是vector容器的迭代器。

#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
	vector<int> v1;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
	}
	for (vector<int>::iterator it = v1.begin(); it < v1.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	vector<int> v2(v1.begin(), v1.end());
	for (vector<int>::iterator it = v2.begin(); it < v2.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	vector<int> v3(10, 5);
	for (vector<int>::iterator it = v3.begin(); it < v3.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	vector<int> v4(v3);
	for (vector<int>::iterator it = v3.begin(); it < v3.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
5   5   5   5   5   5   5   5   5   5
5   5   5   5   5   5   5   5   5   5

vector赋值操作

vector& operator=(const vector &vec)重载赋值运算符=。

assign(beg,end)将beg到end的区间的数据拷贝给本身(包括beg,不包括end)。

assign(n,elem)将n个elem拷贝赋值给本身。

#include<iostream>
#include<vector>
using namespace std;

int main(void)
{
	vector<int> v1;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
	}
	for (vector<int>::iterator it = v1.begin(); it < v1.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	vector<int> v2;
	v2 = v1;
	for (vector<int>::iterator it = v2.begin(); it < v2.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	vector<int> v3;
	v3.assign(v2.begin(), v2.end());
	for (vector<int>::iterator it = v3.begin(); it < v3.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	vector<int> v4;
	v4.assign(10, 12);
	for (vector<int>::iterator it = v4.begin(); it < v4.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
12   12   12   12   12   12   12   12   12   12

vector容量和大小

empty()判断是否为空,空为true,不空为false。

capacity()返回容器的容量。

size()返回容器中元素的个数。

resize(int num)重新指定容器长度为num,如果容器变长,以默认值填充新位置,如果容器变短,就删除超出容器长度的元素。这里的默认值在int类型下是0。

resize(int num,elem)重新指定容器长度为num,如果容器变长,就以elem的值填充新位置,如果容器变短就删除超出容器长度的元素。

#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
	vector<int> v;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v.push_back(i);
	}

	vector<int>::iterator it;
	for(it = v.begin();it < v.end();it += 1){
		cout << *it << "   ";
	}
	cout << endl;

	cout << v.empty() << endl;
	cout << v.capacity() << endl;
	cout << v.size() << endl;

	v.resize(15);
	for (it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	cout << v.empty() << endl;
	cout << v.capacity() << endl;
	cout << v.size() << endl;

	v.resize(20, 10);
	for (it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	cout << v.empty() << endl;
	cout << v.capacity() << endl;
	cout << v.size() << endl;

	v.resize(10);
	for (it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	cout << v.empty() << endl;
	cout << v.capacity() << endl;
	cout << v.size() << endl;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
0
13
10
1   2   3   4   5   6   7   8   9   10   0   0   0   0   0
0
19
15
1   2   3   4   5   6   7   8   9   10   0   0   0   0   0   10   10   10   10   10
0
28
20
1   2   3   4   5   6   7   8   9   10
0
28
10

vector插入和删除

push_back(ele)将ele插入容器末尾。

pop_back()删除容器末尾的元素。

insert(const_iterator pos,ele)在迭代器指向位置pos插入元素ele。

insert(const_iterator pos,int count,ele)在迭代器指向位置pos插入count个元素ele。

erase(const_iterator pos)删除迭代器指向位置pos的元素。

erase(const_iterator start,const_iterator end)删除迭代器从start到end的元素。

clear()清空容器。

#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	v.pop_back();
	v.pop_back();
	for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	v.insert(v.begin(), 5);
	v.insert(v.begin() + 2, 3, 15);
	for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	v.erase(v.begin() + 3);
	v.erase(v.begin() + 5);
	for (vector<int>::iterator it = v.begin(); it < v.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

10   20   30   40   50
10   20   30
5   10   15   15   15   20   30
5   10   15   15   20

vector数据存取

at(int idx)返回索引是idx的数据。

operator[]返回方括号内索引的数据。

front()返回容器第一个元素。

back()返回容器最后一个元素。

#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
	vector<int> v;
	v.push_back(50);
	v.push_back(75);
	v.push_back(25);
	v.push_back(15);
	v.push_back(55);

	int i;
	for (i = 0; i < v.size(); i += 1) {
		cout << v[i] << "   ";
	}
	cout << endl;

	for (i = 0; i < v.size(); i += 1) {
		cout << v.at(i) << "   ";
	}
	cout << endl;

	cout << v.front() << endl;
	cout << v.back() << endl;
	return 0;
}

程序的输出是:

50   75   25   15   55
50   75   25   15   55
50
55

vector互换容器

swap(vec)将vec与本身的元素互换。

#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
	vector<int> v1;
	int i;
	for (i = 1; i <= 10; i += 1) {
		v1.push_back(i);
	}
	vector<int> v2;
	for (i = 10; i > 0; i -= 1) {
		v2.push_back(i);
	}

	for (i = 0; i < v1.size(); i += 1) {
		cout << v1[i] << "   ";
	}
	cout << endl;
	for (i = 0; i < v2.size(); i += 1) {
		cout << v2[i] << "   ";
	}
	cout << endl;

	v1.swap(v2);
	for (i = 0; i < v1.size(); i += 1) {
		cout << v1[i] << "   ";
	}
	cout << endl;
	for (i = 0; i < v2.size(); i += 1) {
		cout << v2[i] << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
10   9   8   7   6   5   4   3   2   1
10   9   8   7   6   5   4   3   2   1
1   2   3   4   5   6   7   8   9   10

vector预留空间

reserve(int len)预留len个元素长度,预留位置不初始化且不可访问。
 

deque容器

deque基本概念

deque是双端数组,可以对头端进行插入和删除操作。

vector对于头部的插入删除效率低,且数据越大效率越低。deque对于头部的插入和删除比vector快。vector访问元素的速度比deque快。

deque内有中控器,维护每段缓冲区的内容,缓冲区中存放数据。中控器维护每个缓冲区地址,使得deque像一片连续的内存空间。

deque构造函数

deque<T> deq创建了一个deque容器,存放T类型数据,名称是deq。

deque(beg,end)将beg到end区间的元素拷贝给本身。

deque(n,elem)将n个elem拷贝给本身。

deque(const deque &deq)是拷贝构造函数。

deque容器名.begin()是开始位置,deque容器名.end()是结束位置。

deque<T>::iterator是deque容器的迭代器。

#include<iostream>
#include<deque>
using namespace std;
int main(void)
{
	deque<int> d1;
	int i;
	for (i = 1; i <= 10; i += 1) {
		d1.push_back(i);
	}
	for (deque<int>::iterator it = d1.begin(); it < d1.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	deque<int> d2(d1);
	for (deque<int>::iterator it = d2.begin(); it < d2.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	deque<int> d3(d2.begin(), d2.end());
	for (deque<int>::iterator it = d3.begin(); it < d3.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	deque<int> d4(10, 10);
	for (deque<int>::iterator it = d4.begin(); it < d4.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
10   10   10   10   10   10   10   10   10   10

deque赋值操作

deque& operator=(const deque&deq)重载等号操作符。

assign(beg,end)将beg到end的数据拷贝给本身。(包括beg不包括end)

assign(n,elem)将n个elem拷贝给本身。

#include<iostream>
#include<deque>
using namespace std;
int main(void)
{
	deque<int> d1;
	int i;
	for (i = 1; i <= 10; i += 1) {
		d1.push_back(i);
	}
	deque<int> d2;
	d2 = d1;

	for (deque<int>::iterator it = d1.begin(); it < d1.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	for (deque<int>::iterator it = d2.begin(); it < d2.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	deque<int> d3;
	d3.assign(d2.begin(), d2.end());
	for (deque<int>::iterator it = d3.begin(); it < d3.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	deque<int> d4;
	d4.assign(10, 25);
	for (deque<int>::iterator it = d4.begin(); it < d4.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
25   25   25   25   25   25   25   25   25   25

deque大小操作

empty()判断是否为空,空返回true,不空返回false。

size()返回容器元素个数。

resize(num)重新指定容器长度为num,如果容器变长以默认值填充新位置,如果容器变短就删除超出容器长度的元素。

resize(num,elem)重新指定容器长度为num,如果容器变长,就以elem值填充新位置,如果容器变短就删除超出容器长度的元素。

#include<iostream>
#include<deque>
using namespace std;
int main(void)
{
	deque<int> d;
	int i;
	for (i = 1; i <= 10; i += 1) {
		d.push_back(i);
	}
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	cout << d.empty() << endl;
	cout << d.size() << endl;
	d.resize(15);
	cout << d.size() << endl;
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	d.resize(20, 20);
	cout << d.size() << endl;
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	d.resize(5);
	cout << d.size() << endl;
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

1   2   3   4   5   6   7   8   9   10
0
10
15
1   2   3   4   5   6   7   8   9   10   0   0   0   0   0
20
1   2   3   4   5   6   7   8   9   10   0   0   0   0   0   20   20   20   20   20
5
1   2   3   4   5

deque插入和删除

push_back(elem)在容器末尾添加elem。

push_front(elem)在容器头部添加elem。

pop_back()删除容器最后一个数据。

pop_front()删除容器第一个数据。

insert(pos,elem)在pos位置插入elem。

insert(pos,n,elem)在pos位置插入n个elem。

insert(pos,beg,end)在pos位置插入从beg到end区间的数据(包括beg不包括end)。

clear()清空容器。
erase(beg,end)删除beg到end区间的数据(包括beg不包括end)。

erase(pos)删除pos位置的数据。

#include<iostream>
#include<deque>
using namespace std;
int main(void)
{
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	d.push_back(50);
	d.push_front(100);
	d.push_front(200);
	d.push_front(300);
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	d.pop_back();
	d.pop_back();
	d.pop_front();
	d.pop_front();
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	d.insert(d.begin() + 1, 50);
	d.insert(d.begin() + 2, 75);
	d.insert(d.begin() + 4, 15);
	d.insert(d.begin() + 6, 5, 25);
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;

	d.erase(d.begin() + 11);
	for (deque<int>::iterator it = d.begin(); it < d.end(); it += 1) {
		cout << *it << "   ";
	}
	cout << endl;
	return 0;
}

程序的输出是:

300   200   100   10   20   30   40   50
100   10   20   30
100   50   75   10   15   20   25   25   25   25   25   30
100   50   75   10   15   20   25   25   25   25   25

deque数据存取

at(int index)返回索引为index的数据。

operator[]返回索引为括号内值的数据。

front()返回第一个元素。

back()返回最后一个元素。

#include<iostream>
#include<deque>
using namespace std;
int main(void)
{
	deque<int> d;
	d.push_back(45);
	d.push_back(65);
	d.push_back(25);
	d.push_back(35);
	d.push_front(150);
	d.push_front(350);

	int i;
	for (i = 0; i < d.size(); i += 1) {
		cout << d[i] << "   ";
	}
	cout << endl;
	for (i = 0; i < d.size(); i += 1) {
		cout << d.at(i) << "   ";
	}
	cout << endl;
	cout << d.front() << endl;
	cout << d.back() << endl;
	return 0;
}

程序的输出是:

350   150   45   65   25   35
350   150   45   65   25   35
350
35

排序操作

sort(iterator beg,iterator end)对区间内元素进行排序。默认升序排序,需要包含algorithm头文件。

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
int main(void)
{
	deque<int> d;
	d.push_back(75);
	d.push_back(95);
	d.push_back(85);
	d.push_front(15);
	d.push_front(45);

	int i;
	for (i = 0; i < d.size(); i += 1) {
		cout << d.at(i) << "   ";
	}
	cout << endl;

	sort(d.begin(), d.end());
	for (i = 0; i < d.size(); i += 1) {
		cout << d.at(i) << "   ";
	}
	cout << endl;
}

程序创建了deque容器,并使用了sort进行排序。程序的输出是:

45   15   75   95   85
15   45   75   85   95

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值