vector(向量)干货归纳+用法示例

本文详细介绍了C++标准库中的vector容器,包括其特点、常用操作如初始化、插入删除元素、访问修改元素及容量操作。此外,还讨论了algorithm库中针对vector的查找、排序、替换等常见操作,以及一些使用vector时的注意事项和常见错误。
摘要由CSDN通过智能技术生成

一.vector特点

  1. 底层原理
    vector底层原理是一个连续的动态数组,使用指针管理内存。vector内部维护了三个指针:指向数组起始位置的指针start、指向数组末尾位置的指针finish和指向数组分配空间末尾位置的指针end_of_storage。
  2. 增加元素
    当vector需要增加元素时,会先检查是否有足够的容量,如果没有,就分配一段更大的内存空间,并将原来的元素移动到新的空间中。这个操作称为重新分配内存(re-allocation)。
  3. 访问元素
    (1).vector支持随机访问,可以通过指针算术运算和下标运算符直接访问元素。由于vector的元素在内存中是连续存储的,因此访问元素的时间复杂度为O(1)。
    (2).除了支持快速随机访问外,vector还支持在末尾添加或删除元素的高效操作,时间复杂度为O(1)。
    (3).但在中间位置插入或删除元素时,需要移动元素,时间复杂度为O(n)。
  4. 优势
    (1).内存管理:vector会自动处理内存分配和释放,无需手动管理。
    (2).高效访问:可以使用下标或迭代器进行高效的随机访问。
    (3).灵活性:vector的大小可以根据需要进行动态调整,不需要预先分配固定大小的空间。
  5. 注意事项
    (1).对vector的中间位置进行插入或删除操作,会导致vector中的元素需要移动位置,这会影响程序的性能。
    (2).在vector的末尾添加元素时,可能会触发vector的重新分配内存,这会导致之前的迭代器和指针失效,需要重新获取。

二.vector常用操作

1.头文件

#include <vector>
#include <algorithm>
//由键盘输入若干个数,存入容器中
	int x;
	vector<int> b;
	while (cin >> x) {    
		b.push_back(x);
	}

2.vector初始化

1)vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。2)vector<int>a(10, 1); //定义了10个整型元素的向量,且给出每个元素的初值为13)vector<int>a(b); //用b向量来创建a向量,整体复制性赋值4)vector<int>a(b.begin(), b.begin() + 3); //定义了a值为b中第0个到第2个(共3个)元素5int b[7]={1,2,3,4,5,9,8};vector<int> a(b,b+7); //从数组中获得初值

3.插入和删除元素

// 创建一个空的vector
std::vector<int> v;

// 在vector末尾添加元素
v.push_back(1);
v.push_back(2);
v.push_back(3);

// 删除vector末尾的元素
v.pop_back();

// 在vector的第二个位置插入元素
v.insert(v.begin() + 1, 4);

// 删除vector的第三个元素
v.erase(v.begin() + 2);

4.访问元素

// 创建一个有5个元素的vector
std::vector<int> v {1, 2, 3, 4, 5};

// 通过下标访问元素
int x = v[0];

// 使用at()函数访问元素
int y = v.at(1);

// 使用迭代器访问元素
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";
}

// 使用范围for循环访问元素
for (int n : v) {
    std::cout << n << " ";
}

5.修改元素

// 创建一个有3个元素的vector
std::vector<int> v {1, 2, 3};

// 修改vector的第二个元素
v[1] = 4;

// 修改vector的第三个元素
v.at(2) = 5;

6.容量操作

// 创建一个有5个元素的vector
std::vector<int> v {1, 2, 3, 4, 5};

// 查询vector的大小
int size = v.size();

// 判断vector是否为空
bool empty = v.empty();

// 查询vector的容量
int capacity = v.capacity();

// 调整vector的容量
v.reserve(10);
v.shrink_to_fit();

7.数据操作

// 创建一个有3个元素的vector
std::vector<int> v {1, 2, 3};

// 获取vector的底层数据指针
int* data = v.data();

// 修改vector的底层数据
data[1] = 4;

8.其他操作

// 创建一个有3个元素的vector
std::vector<int> v {1, 2, 3};

// 交换两个vector
std::vector<int> v2 {4, 5, 6};
v.swap(v2);

// 清空vector
v.clear();

// 在vector末尾插入元素
v.emplace_back(1);
v.emplace_back(2);

// 在vector的第二个位置插入元素
v.emplace(v.begin() + 1, 3);

三.algorithm>库中对vector的常见操作

1.查找和排序操作

find:在vector中查找指定值,并返回迭代器。
find_if:在vector中查找符合指定条件的元素,并返回迭代器。
binary_search:在已排序的vector中查找指定值,返回bool值表示是否找到。
sort:对vector中的元素进行排序。
stable_sort:对vector中的元素进行稳定排序。

2.替换和修改操作

copy:将vector中的元素复制到另一个容器中。
copy_n:将vector中的指定个数的元素复制到另一个容器中。
copy_if:将vector中符合指定条件的元素复制到另一个容器中。
transform:对vector中的元素应用指定操作,将结果存储到另一个容器中。
replace:将vector中指定值替换为另一个值。
replace_if:将vector中符合指定条件的元素替换为另一个值。
remove:从vector中删除指定值。
remove_if:从vector中删除符合指定条件的元素。
unique:从vector中删除相邻的重复元素,只保留一个。

2.其他操作

min_element:返回vector中的最小元素的迭代器。
max_element:返回vector中的最大元素的迭代器。
accumulate:对vector中的元素进行累加操作。
count:计算vector中指定值的出现次数。
count_if:计算vector中符合指定条件的元素的个数。

四.其他

  1. 向量a中添加元素
vector<int> a;
for (int i = 0; i < 10; i++)
	a.push_back(i);
  1. 从数组中选择元素向向量中添加
int a[6] = { 1,2,3,4,5,6 };
vector<int> b;
for (int i = 1; i <= 4; i++)
b.push_back(a[i]);
  1. 从现有向量中选择元素向向量中添加
int a[6] = { 1,2,3,4,5,6 };
vector<int> b;
vector<int> c(a, a + 4);
for (vector<int>::iterator it = c.begin(); it < c.end(); it++)
	b.push_back(*it);
  1. 从文件中读取元素向向量中添加
ifstream in("data.txt");
vector<int> a;
for (int i; in >> i)
a.push_back(i);
  1. 易犯错误
vector<int> a;
for (int i = 0; i < 10; i++)
	a[i] = i;
//这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素,而现在的a[i]还是空的对象
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuZuqiang_3027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值