在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第二十四篇博客。
本篇博客介绍了C++的vector容器和deque容器。
本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。
目录
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