使用方法:
创建
创建一个存储整数的空 vector
vector<int> myVector;
创建一个包含 5 个整数的 vector,每个值都为默认值(0)
vector<int> myVector(5);
创建一个包含 5 个整数的 vector,每个值都为 10
vector<int> myVector(5, 10);
默认初始化一个空的 vector
vector<int> vec;
初始化一个包含元素的 vector
vector<int> vec2 = {1, 2, 3, 4};
添加
将整数 7 添加到 vector 的末尾
myVector.push_back(7);
效果上同,但更高效,推荐使用
myVector.emplace_back(10);
下标为1的位置插入100
myVector.insert(myVector.begin() + 1, 100);
访问
获取第一个元素
int x = myVector[0]
获取第二个元素
int y = myVector.at(1)
返回第一个元素的引用
int m = myVector.front()
返回最后一个元素的引用
int n = myVector.back()
删除
删除第三个元素
myVector.erase(myVector.begin() + 2);
删除第三个 及 往后的所有元素
myVector.erase(myVector.begin() + 2,myVector.end());
清空 vector
myVector.clear();
容量(可用于条件判断)
检查vector是否为空,即是否包含元素
myVector.empty();
返回vector中元素的数量
myVector.size();
返回vector能容纳的最大元素数量
myVector.max_size();
调整vector的容量以至少能容纳10个元素
myVector.reserve(10);
返回vector当前分配的以元素个数
myVector.capacity();
遍历元素
返回指向逆向迭代的第一个元素的迭代器
rbegin();
返回指向逆向迭代的最后一个元素的迭代器之后的位置的迭代器
rend();
返回指向第一个元素的迭代器
begin();
返回指向最后一个元素之后的位置的迭代器
end();
for (auto it = myVector.begin(); it != myVector.end(); ++it) {
std::cout << *it << " ";
}
for (int element : myVector) {
std::cout << element << " ";
}
特殊操作(排序,颠倒,查最值及下标,去重)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> v;
cout << "初始vector\n";
for (int i = 0; i < 10; i++) {
v.emplace_back(i);
//v.emplace_back(i % 3);可用于消除元素的测试
cout << v[i] << '\t';
}
// 排序,sort默认升序,降序,需要传入第三个参数,如下
sort(v.begin()+2, v.end()-2, [](int a, int b) {return a > b; });
cout << "\n将第3个原素 到 倒数第3个元素 降序排序\n";
for (auto it : v) {
cout << it << "\t";
}
// 颠倒位置,没有自动排序的功能
reverse(v.begin(), v.end());
cout << "\n颠倒位置\n";
for (auto it : v) {
cout << it << "\t";
}
// 在指定范围找最值
// 最小值
cout << "\n最小值 : " << *min_element(v.begin(), v.end()) << endl;
// 最大值
cout << "最大值 : " << *max_element(v.begin(), v.end()) << endl;
// 查找两个元素间的距离,一般获取最值下标
cout << "最大值的下标:" << distance(v.begin(), max_element(v.begin(), v.end())) << endl;
// 消除相邻的重复元素,需要与sort配合使用
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
cout << "删除重复元素,且有序输出\n";
for (auto it:v) {
cout << it << "\t";
}
// 获取0在v中出现的次数
count(v.begin(),v.end(),0);
// find查找指定元素的位置,返回一个迭代器
cout<<distance(v.begin(),find(v.begin(),v.end(),0));
return 0;
}
unique函数将相邻的重复元素全部放到vector尾部,最后返回第一个重复元素所在位置的迭代器,因此,v.erase(unique(v.begin(), v.end()), v.end())将删除从该位置往后的所有元素,即可达到效果
C++ 中,vector
动态管理内部元素的内存分配和释放时的特点:
-
内存分配策略: 当元素数量达到当前分配的容量时,
vector
会分配一个新的更大的内存块来存储现有元素和新添加的元素,然后将所有元素从旧内存块复制到新内存块,确保所有元素存储在连续的内存块中,保证元素的连续性不被破坏 -
动态内存管理: 使用
new
分配一个数据类型时,不会影响vector
管理的内存块,除非new
分配的内存恰好位于vector
即将分配的新内存块的地址范围内。在现代操作系统中,内存管理器会确保分配的内存块不会相互冲突 -
空间预留: 频繁的内存重新分配可能会导致内存碎片和性能问题。为避免这种情况,
vector
通常会预留超出当前需求的额外容量,以减少重新分配的次数 -
内存分配器:
vector
使用分配器(allocator)来处理内存分配和释放。分配器负责跟踪空闲内存,并确保新分配的内存块不会与其他内存块冲突