C++ vector常用用法

本文详细介绍了C++标准库中的std::vector容器,包括其声明、初始化、元素访问、添加和删除元素的方法,以及其它常用操作如大小调整和安全性特性。

在C++中,std::vector是一个动态数组容器,可以存储任意类型的元素,并且大小可以动态调整。vector包含着一系列连续存储的元素,其行为和数组类似。访问vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在vector中插入元素则是线性时间复杂度。以下是std::vector的一些常用用法和操作:

1. 包含头文件

在使用std::vector之前,需要包含头文件#include<vector>。

2. 声明和初始化

可以通过以下方式声明和初始化std::vector:

std::vector<int> vec;  // 声明一个空的整数向量
std::vector<string> vec1;  // 声明一个字符串型向量
std::vector<int> vec2(5);  // 声明一个包含5个元素的整数向量,初始值为0
std::vector<int> vec3(5, 10);  // 声明一个包含5个元素的整数向量,初始值为10
std::vector<int> vec4 = {1, 2, 3, 4};  // 使用初始化列表声明并初始化向量 

3. 访问元素

可以通过下标访问std::vector中的元素,也可以使用迭代器来遍历:

#include<iostream>
#include<vector>
using namespace std;
	
int main() {
	vector<int> vec = {1, 2, 3, 4, 5};
	for(int i = 0; i < vec.size(); i++) {  // 通过下标访问
		cout << vec[i] << " ";
	}
	cout << endl;
	
    // 通过迭代器遍历访问
	for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
		cout << *it << " ";
	}
	return 0;
}

4. 添加和删除元素

可以使用push_back在向量的末尾添加元素,使用pop_back删除末尾元素,也可以使用insert和erase在指定位置插入和删除元素:

#include<iostream>
#include<vector>
using namespace std;
	
int main() {
	vector<int> vec = {1, 2, 3, 4, 5};
	vec.push_back(6);  // 向末尾添加元素6 
	for(int i = 0; i < vec.size(); i++) {  // 1 2 3 4 5 6
		cout << vec[i] << " ";
	}
	cout << endl;
	
	vec.pop_back();  // 删除末尾的元素
	for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {  // 1 2 3 4 5
		cout << *it << " ";
	}	
	cout << endl; 
	
	vec.insert(vec.begin() + 1, 10);  // 在第2个位置插入元素10 
	for(int i = 0; i < vec.size(); i++) {  // 1 10 2 3 4 5
		cout << vec[i] << " ";
	}
	cout << endl;
	
	vec.erase(vec.begin() + 2);  // 删除第3个元素
	for(int i = 0; i < vec.size(); i++) {  // 1 10 3 4 5
		cout << vec[i] << " ";
	}
	cout << endl;	 
	return 0;
}

5. 其他常用操作

①size():返回向量中元素的个数

②empty():判断向量是否为空

③clear():清空向量中的所有元素

④resize():调整向量的大小

⑤swap():交换两个向量的内容

方法语法作用
assign

1. void assign(input_iterator start, input_iterator end);

2. void assign(size_type num, const TYPE &val);

1. 将区间[start, end)的元素赋到当前vector

2. 赋num个值为val的元素到vector中
注:这个函数将会清除掉为vector赋值以前的内容

atTYPE at(size_type loc);返回当前vector指定位置loc的元素的引用,at()函数比[]运算符更加安全,因为它不会让你去访问到vector内越界的元素(见附)
backTYPE back();返回当前vector最末尾一个元素的引用
beginiterator begin();返回一个指向当前vector起始元素的迭代器
capacitysize_type capacity();返回当前vector在重新进行内存分配以前所能够容纳的元素数量
clearvoid clear();删除当前vector中的所有元素
emptybool empty();如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false
enditerator end();

返回一个指向当前vector末尾元素的下一位置的迭代器。

注意:如果要访问末尾元素,需要先将此迭代器自减1

erase

1. iterator erase(iterator loc);

2. iterator erase(iterator start, iterator end);

1. 删除指定位置loc的元素

2. 删除区间[start, end)的所有元素。返回值是指向删除的最后一个元素的下一位置的迭代器

frontTYPE front();返回当前vector的内存分配器
get_allocatorallocator_type get_allocator();返回当前vector的内存分配器
insert

1. iterator insert(iterator loc, const TYPE &val);

2. void insert(iterator lov, size_type num, const TYPE &val);

3. void insert(iterator loc, input_iterator start, input_iterator end);

1. 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器

2. 在指定位置loc前插入num个值为val的元素

3. 在指定位置前插入区间[start, end)的所有元素

max_sizesize_type max_size();返回当前vector能够容纳元素数量的最大值(包括可重新分配内存)
pop_backvoid pop_back();删除当前vector最末尾的一个元素
push_backvoid push_back(const TYPE &val);添加值为val的元素到当前vector末尾
rbeginreverse_iterator rbegin();

返回指向当前vector末尾的逆向迭代器

注:实际指向末尾的下一位置,而其内容为末尾元素的值

rendreverse_iterator rend();返回指向当前vector起始位置的逆迭代器
reservevoid reserve(size_type size);

为当前vector预留至少共容纳size个元素的空间

注:实际空间可能大于size

resizevoid resize(size_type size, TYPE val);改变当前vector的大小为size, 且对新创建的元素赋值为val
sizesize_type size();返回当前vector所容纳元素的数目
swapvoid swap(vector &from);交换当前vector与vector from 的元素

附:

1. at函数与"[]"运算符在访问元素时的差异

#include<iostream>
#include<vector>
using namespace std;
	
int main() {	
	vector<int> v(5, 1);
	cout << "使用[]运算符:" << endl;
	for(int i = 0; i < 10; i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	
	cout << "使用at()函数:" << endl;
	for(int i = 0; i < 10; i++) {
		cout << v.at(i) << " ";
	}
	cout << endl;
	return 0;
}

at()函数能够辨别出访问是否越界并在越界的时候抛出一个异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值