• STL:vector容器详解


    vector容器数据结构与数组十分类似,也称为单端数组。vector与数组的不同之处在与数组是静态空间,而vector可以动态扩展。
    这里简单介绍一下什么是动态扩展:
    动态扩展并不是在原空间之后续接新的空间(因为无法保证后序的空间是否被占用),而是找一个更大的内存空间,然后将原数据拷贝到新空间,并释放原来的空间。
    具体vector容器的结构图如下所示:
    在这里插入图片描述

    从图中可以看出:
    1.push_back()方法用于在尾部插入数据,pop_back()用于在尾部删除数据,即尾插与尾删;
    2.front()代表容器中的第一个元素,back()代表容器中的最后一个元素;
    3.vector主要有4个迭代器,v.begin()代表第一个元素的位置,v.end()代表最后一个元素的下一个位置,v.rbegin()代表尾部第一个元素的位置,而v.rend()代表第一个元素的前一个位置;
    4.vector对外提供了很多接口,包括insert可以插入数据,erase可以删除数据等。

    另外需要注意的是:vector容器的迭代器是支持随机访问的迭代器

    1.vector的构造函数

    函数描述
    vector v采用模板实现类实现,默认构造函数
    vector(v.begin(),v.end())将v[begin(),end())区间中的元素拷贝给本身,即区间构造
    vector(n,elem)构造函数将n个elem元素拷贝给本身
    vector(const vector& vec)拷贝构造函数

    具体的实现检验代码如下所示:

    #include
    #include
    using namespace std;
    //vector容器的构造函数
    void printVector(vector<int>&v) {
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }//输入vector容器中的元素
    int main() {
    	vector<int> v1;//默认构造 无参构造
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);;
    	}
    	printVector(v1);
    	//通过区间方式进行构造
    	//v1.begin()代表第一个元素的位置 v1.end()代表最后一个元素的下一个位置
    	vector<int> v2(v1.begin()+1, v1.end()-1);
    	printVector(v2);
    
    	//n个elem方式构造
    	vector<int> v3(10, 100);//10个100的初始化操作
    	printVector(v3);
    
    	//拷贝构造
    	vector<int> v4(v3);
    	printVector(v4);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    总之,vect的多种构造方式没有可比性,灵活使用即可!

    2.vector的赋值操作

    vector的赋值操作主要有operator=和assign两种赋值方式,具体使用如下表所示:

    函数描述
    vector& operator=(const vector & vec)重载等号操作符
    assign(beg,end)将[beg,end)区间中的数据拷贝赋值给本身 beg和end都是迭代器
    assign(n,elem)将n个elem拷贝赋值给本身
    #include
    #include
    using namespace std;
    //vector容器的赋值操作
    void printVector(vector<int>&v) {
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    int main() {
    	vector<int> v1;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);
    	}
    	printVector(v1);
    	//赋值 operator=
    	vector<int> v2;
    	v2 = v1;
    	printVector(v2);//作用和拷贝构造函数类似 即vector v2(v1)
    	//assign赋值
    	vector<int> v3;
    	v3.assign(v1.begin(), v1.end());
    	printVector(v3);
    	//n个elem方式赋值
    	vector<int> v4;
    	v4.assign(10, 100);
    	printVector(v4);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    总结:vector赋值方式简单,使用operator=或者assign都可以,总是一定要熟练使用一种。

    3.vector容量和大小

    对vector容器的容量和大小的操作主要有empty,capacity,size,resize等函数可以使用,具体如下表所示:

    函数描述
    empty()判断容器是否为空
    capacity()返回容器的容量
    size()返回容器中元素的个数
    resize(int num)重新制定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
    resize(int num,int elem)重新制定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
    #include
    #include
    using namespace std;
    //vector容器的赋值操作
    void printVector(vector<int> &v) {
    	for (auto it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    int main() {
    	vector<int> v1;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);
    	}
    	printVector(v1);
    	//判断容器是否为空
    	if (v1.empty()) {//为真代表容器为空
    		cout << "v1容器为空" << endl;
    	}else{
    		cout << "v1容器不为空" << endl;
    		cout << "v1的容量为:" << v1.capacity() << endl;
    		cout << "v1中元素的个数为:" << v1.size() << endl;
    	}
    	//重新制定大小
    	v1.resize(15);//如果重新指定的大小比原来更长 默认用0填充新的位置
    	printVector(v1);
    	v1.resize(20, 100);//利用重载的版本resize可以指定默认填充值
    	printVector(v1);
    	v1.resize(5);//如果重新指定的大小比原来短了 超出本分会自动删除
    	printVector(v1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4.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)删除迭代器指向的元素
    erase(const_iterator start,const_iterator end)删除迭代器从start到end之间的元素
    clear()删除容器中所有元素

    具体API的操作代码如下所示:

    #include
    #include
    using namespace std;
    //vector容器的插入与删除
    void printVector(vector<int> &v) {
    	for (auto it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    int main() {
    	vector<int> v1;
    	//尾插
    	v1.push_back(10);
    	v1.push_back(20);
    	v1.push_back(30);
    	v1.push_back(40);
    	v1.push_back(50);
    	//遍历
    	printVector(v1);
    	//尾删
    	v1.pop_back();
    	printVector(v1);
    	//插入 第一个参数是迭代器
    	v1.insert(v1.begin(), 100);
    	printVector(v1);
    
    	v1.insert(v1.end(), 2, 1000);
    	printVector(v1);
    
    	//删除 参数也是迭代器
    	v1.erase(v1.begin());
    	printVector(v1);
    	//区间删除 仅仅保留最后一个元素
    	v1.erase(v1.begin(), v1.end()-1);
    	printVector(v1);
    	//清空
    	v1.clear();//相当于v1.erase(v1.begin(),v1.end());
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    5.vector数据存取

    对vector中的数据进行存取操作,主要有两种方式,即是通过at()函数以及[]来获取,另外通过front()可以获取容器中的第一个元素,通过back()可以获取最后一个元素。具体如下表所示:

    函数描述
    at(int index)返回索引index所指的元素
    operator[index]返回索引index所指的数据
    front()返回容器中的第一个元素
    back()返回容器中的最后一个元素
    #include
    #include
    using namespace std;
    //vector容器数据存取
    int main() {
    	vector<int> v1;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);
    	}
    	//利用[]来访问数组中的元素
    	for (int i = 0; i < v1.size(); i++) {
    		cout << v1[i] << " ";//string的遍历每个字符也可以使用[]
    	}
    	cout << endl;
    
    	for (int i = 0; i < 10; i++) {
    		cout << v1.at(i) << " ";//string的遍历每个字符也可以使用at函数
    	}
    	cout << endl;
    	//获取容器的第一个元素
    	cout << "v1容器中的第一个元素是:" << v1.front();
    
    	//获取容器中的最后一个元素
    	cout << "v1的最后一个元素为:" << v1.back();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    总之,访问vector容器中的元素有三种方式,即迭代器,[]和at函数!

    6.vector互换容器

    vector容器互换其本质上就是实现两个容器内元素进行互换。

    函数描述
    void swap(vector &vec)将vec与本身的元素互换
    #include
    #include
    using namespace std;
    //vector容器的互换
    /*
    实际用途
    巧用swap可以收缩内存空间
    */
    void test() {
    	vector<int> v;
    	for (int i = 0; i < 100000; i++) {
    		v.push_back(i);
    	}
    	cout << "v的容量为:" << v.capacity() << endl;
    	cout << "v的大小为:" << v.size() << endl;
    	//重新指定大小 但是v1容器的所占容量不变
    	v.resize(3); 
    	cout << "v的容量为:" << v.capacity() << endl;
    	cout << "v的大小为:" << v.size() << endl;
    	//巧用swap收缩内存
    	vector<int>(v).swap(v);
    	cout << "v的容量为:" << v.capacity() << endl;
    	cout << "v的大小为:" << v.size() << endl;
    }
    void printVector(vector<int>& v) {
    	for (auto it = v.begin(); it != v.end(); it++) {
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    int main() {
    	cout << "v1与v2交换前" << endl;
    	vector<int> v1;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);
    	}
    	printVector(v1);
    	vector<int> v2;
    	for (int i = 10; i > 0; i--) {
    		v2.push_back(i);
    	}
    	printVector(v2);
    	cout << "v1与v2交换后" << endl;
    	v1.swap(v2);
    	printVector(v1);
    	printVector(v2);
    	test();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    【计算机基础】数据结构一览
    【C进阶】指针(二)
    HTML 基本开发方式,学会常用的 HTML 标签
    第二章-H3C-网络设备操作入门
    Python学习:整数类型(int)详解
    目标检测:VarifocalNet: An IoU-aware Dense Object Detector(CVPR2021)
    深入理解强化学习——多臂赌博机:乐观初始值
    unittest测试框架的价值
    接上篇文章,完成Hadoop集群部署实验
    【记录】mmsegmentation 训练自己的数据集
  • 原文地址:https://blog.csdn.net/qq_51447436/article/details/126680940