【STL——vector容器】

引入

在编程中,Vector 通常指动态数组,能够自动调整大小以适应元素的增减。

c++ 中,vector 是一个十分有用的容器,它能够像容器一样存放各种类型 的对象。也就是说,vector是一个 能够存放任意类型的动态数组
一个容器中的所有对象 都必须是同一种类型的。

  • Vector 的特点:
  1. 动态大小:Vector 可以根据需要自动扩展或收缩容量
  2. 连续存储:元素在内存中是连续存储 的,支持快速随机访问
  3. 高效操作:在末尾插入或删除元素的时间复杂度为 O(1),但在中间或开头操作可能需要 O(n)。
    第2、3条特点都与数组相同,唯一不同就是vector容量自动调整,是动态的。

vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。

头文件

使用vector须包含头文件:

#include< vector>

声明与初始化
  • vector 可以声明各种类型:

整型数组:

vector vec = { 1,2,3,4,5 };

字符型:

vector vec1 = { 'h','e','l','l','o' };

double:

vector vec2 = { 1.1,2.2,3.3 };

等等很多类型。

  • 利用构造函数初始化
    vector():创建一个空vector
    vector(int nSize):创建一个vector,元素个数为nSize
    vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
    vector(const vector&):复制构造函数(括号里面的也是vector)
    vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
cpp 复制代码
	vector<int> vec{};
	//vector<int> vec;
	vector<int> vec1(9); //未定义初始值时默认0
	vector<int> vec2(8, 1); //申请8个空间且都存1
	vector<int> vec3(vec2);
	//将vec1下标范围为[begin(), begin() + 1)位置上的内容复制给vec4(区间为左闭右开)
	vector<int> vec4(vec1.begin(), vec1.begin() + 1);
遍历函数

reference at(int pos)​:返回pos位置元素的引用

​reference front()​:返回首元素的引用

​reference back()​:返回尾元素的引用

​iterator begin()​:返回向量头指针,指向第一个元

​iterator end()​:返回向量尾指针,指向向量最后一个元素的下一个位置

reverse_iterator rbegin()​:反向迭代器,指向最后一个元素

reverse_iterator rend()​:反向迭代器,指向第一个元素之前的位置

cpp 复制代码
void test() {
	vector<int> vec1 = {0,1,2,3,4,5,6,7,8};
	cout << vec1.at(5) << endl;  //打印下标为5的内容:5
	cout << vec1.front() << endl; //打印第一个的内容:0
	cout << vec1.back() << endl;  //打印最后一个的内容:8
//begin()不是下标,而是迭代器,它更像一个智能指针,指向容器中的元素
	//此时的vec1.end()指向最后一个元素的下个位置
	// i != vec1.end()这个条件保证迭代器从头元素遍历到末元素就结束
	for (auto i = vec1.begin(); i != vec1.end(); i++) {
		cout << *i << " ";  //需要解引用 * 来获取值
	}
	//输出:0 1 2 3 4 5 6 7 8
	cout << endl;
	for (auto i = vec1.rbegin(); i != vec1.rend(); i++) {
		cout << *i << " ";
	}
	//输出:8 7 6 5 4 3 2 1 0
}
增加函数

​void push_back(const T& x)​

//向量尾部增加一个元素X

iterator insert(iteratorit,const T& x)​

//向量中迭代器指向元素前增加一个元素x

​iterator insert(iterator it,int n,const T& x)​

//向量中迭代器指向元素前增加n个相同的元素x

​iterator insert(iterator it,const_iterator first,const_iterator last)​

//向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

cpp 复制代码
void testQ() {
	vector<int> v = {6,7,8};
	vector<int> v1 = { 20,30,40 };
	v.push_back(10); //在尾部加1个10(单写数值不写数量均按1处理)
	//此时内容为:6 7 8 10
	v.insert(v.begin(), 11); //在开头位置的前面加一个11
	//此时内容为:11 6 7 8 10
	v.insert(v.begin()+4, 1, 9); //在下标4位置前面加1个9
	//此时内容为:11 6 7 8 9 10
	
	v.insert(v.begin() + 1, 3, 5); //在下标1位置前面加3个5
	//此时内容为:11 5 5 5 6 7 8 9 10

	v.insert(v.begin(), v1.begin(), v1.end()); //在v下标0位置前面加v1下标[begin,end]的内容
	//此时内容为:20 30 40 11 5 5 5 6 7 8 9 10
}
删除函数

iterator erase(iterator it)​:删除向量中迭代器指向元素

​iterator erase(iterator first,iterator last)​:删除向量中**[first,last)**中元素

void pop_back()​:删除向量中最后一个元素

void clear()​:清空向量中所有元素

cpp 复制代码
void testQ() {
	vector<int> v = {4,5,9,6,7,8};
	v.erase(v.begin() + 2); //删除坐标2位置上的元素(9)
	//此时内容为:4 5 6 7 8
	
	v.erase(v.begin() + 1, v.begin() + 3);//删除坐标[1,3)位置上的元素(5、6)
	//此时内容为:4 7 8
	
	v.pop_back(); //删除最后一个元素(8)
	//此时内容为:4 7
	
	v.clear(); //清空所有元素
	
}
判断函数

清空所有元素之后再判断v是否为空,为空则为真,输出1

大小函数

int size() const​:返回向量中元素的个数

​int capacity() const​:返回当前向量所能容纳的最大元素值

​int max_size() const​:返回最大可允许的 vector 元素数量值

cpp 复制代码
void testQ() {
	vector<int> v = {4,5,9,6,7,8};
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	cout << v.max_size() << endl;
}
其他函数

void swap(vector&)​:交换两个同类型向量的数据

cpp 复制代码
void testQ() {
	vector<int> v;
	v.assign(5, 3); //v只含5个元素且都为3
	vector<int> v1 = { 1,2,3,4,5 };
	vector<int> v2 = { 11,22,33 };
	v1.swap(v2); //交换v1和v2
	//此时v2={1,2,3,4,5};
}

void assign(int n,const T& x)​:设置向量中前n个元素的值为x

void assign(const_iterator first,const_iterator last)​:向量中[first,last)中元素设置成当前向量元素

cpp 复制代码
void testQ() {
	vector<int> v;
	v.assign(5, 3); //v只含5个元素且都为3
	vector<int> v1 = { 1,2,3,4,5 };
	vector<int> v2 = { 11,22,33 };
	for (auto i = v2.begin(); i != v2.end(); i++) {
		cout << *i << " ";
	}
	cout << endl;
	v2.assign(v1.begin(), v1.end()); //将v2设置成v1[begin,end)的内容
	//v2={1,2,3,4,5}
}
练习

输入n,随机n个1-100的数字,装入vector,找出里面最大值和最小值。

cpp 复制代码
void testQ() {
	int n = 0;
	cin >> n;
	vector<int> v;
	srand(time(0)); //要加ctime头文件
	for (int i = 0; i < n; i++) {
		v.push_back(rand() % 100 + 1); //产生1~100的随机数
	}
	int max = v[0], min = v[0];
	for (int i = 0; i < n; i++) {
		if (max < v[i]) {
			max = v[i];
		}
		if (min > v[i]) {
			min = v[i];
		}
	}
	//查看随机数
	for (int i = 0; i < n; i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	cout << max << " " << min;
}
相关推荐
lly2024063 小时前
数据访问对象模式(Data Access Object Pattern)
开发语言
std860214 小时前
Rust 与 Python – 这是未来的语言吗?
开发语言·python·rust
相偎4 小时前
用观察者模式通知UI刷新数据
c++
2503_930123934 小时前
Kubernetes (六)调度策略详解:从节点匹配到Pod调度全流程
java·开发语言
曾凡宇先生4 小时前
openEuler安装jdk,nginx,redis
linux·开发语言·数据库·openeuler
weixin_46684 小时前
Python编程之面向对象
开发语言·人工智能·python
YBN娜4 小时前
设计模式-创建型设计模式
java·开发语言·设计模式
CoderCodingNo4 小时前
【GESP】C++四级真题 luogu-B4040 [GESP202409 四级] 黑白方块
开发语言·c++
小火柴1235 小时前
利用R绘制条形图
开发语言·r语言