vector的定义
vector表示对象的集合,是一个表示可变大小数组的序列容器。就像数组一样,vector也采用连续储存空间来储存元素,也就是可以采用下标访问vector容器中的元素。但是它和数组不同的是它的大小是可以动态改变的。
从本质上来讲,vector使用动态分配数组来储存它的元素。每当插入一个新元素时,vector都会重新分配一个新的数组,然后将全部元素复制到这个新数组中,但是这将耗费很多空间和时间。
所以vector具有分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。
vector的初始化
//T是指各种数据类型,如 int,float,double等
vector<T> x;
vector<T> b(x); //例如当x = 10时,b这个容器中有10个元素。
vector<T> c = x;
vector<T> v2(n,a);//由n个a组成的vector
vector<T> v4<n>;//n个默认的元素
vector<T> v3 = { a,b,c,d };
vector<T> v5{ a,b,c };//注意是{},不是();
向vector中插入数据
//使用push_back
myv.push_back(9);//向向量尾部增加一个整数9
iterator it =myv.begin()+3;//定义it迭代器,it指向myv第4个元素
myv.insert(it,9);//在迭代器it前增加1个数9
iterator it =myv.begin()+3;//定义it迭代器,it指向myv第4个元素
myv.insert(it,2,9);//在迭代器it前增加2个数9
删除vector中的元素
方法一:使用 erase-remove 算法
vector<int> vec = {1, 2, 3, 2, 4, 2, 5};
// 删除值为 2 的所有元素
vec.erase(remove(vec.begin(), vec.end(), 2), vec.end());
// 输出剩余的元素
for (int i : vec) {
cout << i << " ";
}
cout << endl;
方法二:使用循环逐个删除
vector<int> vec = {1, 2, 3, 2, 4, 2, 5};
int target = 2;
// 循环遍历删除特定值的元素
for (auto it = vec.begin(); it != vec.end(); ) {
if (*it == target) {
it = vec.erase(it); // erase 返回指向下一个元素的迭代器
} else {
++it;
}
}
// 输出剩余的元素
for (int i : vec) {
cout << i << " ";
}
cout << endl;
方法三:使用 std::remove_if 和 lambda 表达式
这个方法较为复杂
vector<int> vec = {1, 2, 3, 2, 4, 2, 5};
int target = 2;
// 使用 remove_if 和 lambda 表达式删除所有满足条件的元素
vec.erase(remove_if(vec.begin(), vec.end(), [target](int x){ return x == target; }), vec.end());
// 输出剩余的元素
for (int i : vec) {
cout << i << " ";
}
cout << endl;
vector中数据的访问
可以使用[ ] 或 at( ) 来访问
int firstElement = myv[0];
int secondElement = myv.at(1);
输出vector中的值
vector<int> myv;
for(auto a : myv){
cout << a <<endl;
}//此时什么也不会输出,因为我们没有向vector中写入数据
vector<int> myv1(10,'a');
for(auto a : myv1){
cour << a <<endl;
}//此时会输出十个97,因为a的ascii码为97;
方法一:使用范围循环(Range-based for loop)
使用范围循环可以简洁地遍历 std::vector 中的所有元素:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用范围循环输出每个元素
for (int i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
方法二:使用迭代器循环
使用迭代器循环适用于需要更灵活控制的情况:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用迭代器循环输出每个元素
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
方法三:使用标准库算法和流迭代器
使用标准库算法和流迭代器结合 std::copy 可以将 std::vector 中的元素直接输出到流中:
#include <iostream>
#include <vector>
#include <iterator> // for std::ostream_iterator
#include <algorithm> // for std::copy
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用 std::copy 和流迭代器将元素输出到标准输出
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
方法四:使用范围输出
如果你使用的是 C++20 或更新的版本,还可以使用范围输出 (Range-based Output):
#include <iostream>
#include <vector>
#include <ranges> // for std::ranges::ostream_range
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用范围输出将元素输出到标准输出
std::cout << std::ranges::ostream_range(std::cout, " ", vec) << std::endl;
return 0;
}
本文参考网址:
https://blog.youkuaiyun.com/weixin_45922174/article/details/128653260?
https://www.bilibili.com/video/BV1jC41187hV/?spm_id_from=333.337.search-card.all.click&vd_source=38e7d611d9d666eb47800c04d9cc87f4