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<T> v 采用模板实现类实现,默认构造函数
vector(v.begin(),v.end()) 将v[begin(),end())区间中的元素拷贝给本身,即区间构造
vector(n,elem) 构造函数将n个elem元素拷贝给本身
vector(const vector& vec) 拷贝构造函数

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

#include<iostream>
#include<vector>
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;
}

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

2.vector的赋值操作

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

函数 描述
vector& operator=(const vector & vec) 重载等号操作符
assign(beg,end) 将[beg,end)区间中的数据拷贝赋值给本身 beg和end都是迭代器
assign(n,elem) 将n个elem拷贝赋值给本身
#include<iostream>
#include<vector>
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<int> 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;
}

总结: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<iostream>
#include<vector>
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;
}

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<iostream>
#include<vector>
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;
}

5.vector数据存取

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

函数 描述
at(int index) 返回索引index所指的元素
operator[index] 返回索引index所指的数据
front() 返回容器中的第一个元素
back() 返回容器中的最后一个元素
#include<iostream>
#include<vector>
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;
}

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

6.vector互换容器

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

函数 描述
void swap(vector<T> &vec) 将vec与本身的元素互换
#include<iostream>
#include<vector>
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;
}

猜你喜欢

转载自blog.csdn.net/qq_51447436/article/details/126680940