1 引言
编程时常用的Vector操作有创建、访问元素、增加元素、删除元素、修改元素、查找索引以及一些常用的函数操作,本文总结了一下这些方法在C++里面的实现方式(并不是唯一的)。
2 创建
操作类别 | 注释 | C++ |
创建 | 创建空向量 | vector<int>a; |
创建向量常量 | std::vector<int> a = {1, 2, 3, 4, 5 }; | |
创建长度为3,值为0的向量 | std::vector<int> a(3); | |
创建长度为3,值为1的向量 | std::vector<int> a; a.assign(3, 1); |
3 访问元素
操作类别 | 注释 | C++ |
创建 | 创建空向量 | vector<int>a; |
创建向量常量 | std::vector<int> a = {1, 2, 3, 4, 5 }; | |
创建长度为3,值为0的向量 | std::vector<int> a(3); | |
创建长度为3,值为1的向量 | std::vector<int> a; a.assign(3, 1); | |
访问 | 访问第i个元素 | v[i] |
切片,第i到j个元素 | std::vector<int> vec; vec.assign(v.begin() + i-1, v.begin() + j)//新生成v的子数组vec |
4 增加元素
操作类别 | 注释 | C++ |
增加 | 在起始位置增加一个元素 | a.insert(a.begin() + 0, 5); |
在中间位置增加一个元素 | a.insert(a.begin() + i-1, 5); | |
在末尾位置增加一个元素 | a.push_back(5); | |
在起始位置增加一段元素 | a.insert(a.begin() + 0, b.begin(), b.end()); | |
在中间位置增加一段元素 | a.insert(a.begin() + i-1, b.begin(), b.end()); | |
在末尾位置增加一段元素 | a.insert(a.end(),b.begin(), b.end()); |
5 删除元素
操作类别 | 注释 | C++ |
删除 | 删除第一个元素 | a.erase(a.begin() , a.begin() + 1); |
删除最后一个元素 | a.pop_back(); | |
删除第i个元素 | a.erase(a.begin()+i-1, a.begin() + i); | |
删除开始位置长度固定的元素 | a.erase(a.begin() , a.begin()+length); | |
删除中间段(第i个位置)长度固定的元素 | a.erase(a.begin() + i - 1, a.begin() + i + length - 1); | |
删除末尾位置长度固定的元素 | a.erase(a.end() -length, a.end()); | |
删除全部的元素 | a.clear(); |
6 修改元素
操作类别 | 注释 | C++ |
修改 | 修改第一个元素 | a[0] = 100; |
修改第i个元素 | a[i] = 200; | |
修改最后一个元素 | a.back() = 300; | |
修改第一段元素 | copy(b.begin(), b.end(), a.begin()); | |
修改中间段元素 | copy(b.begin(), b.end(), a.begin()+i-1); | |
修改最后一段元素 | copy(b.begin(), b.end(), a.end() -b.size()); |
7 查找元素
操作类别 | 注释 | C++ |
查找 | 查找等于某个值的第一个索引 | for (int i = 0; i < a.size(); i++) { if (a[i] == target) { index = i; break; } } |
查找等于某个值的最后一个索引 | for (int i = 0; i < a.size(); i++) { if (a[i] == target) { index = i; } } | |
查找等于某个值的所有索引 | for (int i = 0; i < a.size(); i++) { if (a[i] == target) { all_index.push_back(i); } } | |
查找大于某个值的第一个索引 | for (int i = 0; i < a.size(); i++) { if (a[i] > target) { index = i; break; } } | |
查找大于某个值的最后一个索引 | for (int i = 0; i < a.size(); i++) { if (a[i] > target) { index = i; } } | |
查找大于某个值的所有索引 | for (int i = 0; i < a.size(); i++) { if (a[i] > target) { all_index.push_back(i); } } | |
查找小于某个值的第一个索引 | for (int i = 0; i < a.size(); i++) { if (a[i] < target) { index = i; break; } } | |
查找小于某个值的最后一个索引 | for (int i = 0; i < a.size(); i++) { if (a[i] < target) { index = i; } } | |
查找小于某个值的所有索引 | for (int i = 0; i < a.size(); i++) { if (a[i] <= target) { all_index.push_back(i); } } |
8 常用函数
操作类别 | 注释 | C++ |
向量函数 | 求和 | std::accumulate(v.begin(), v.end(), 0);//0是初始值 |
均值 | static_cast<double> std::accumulate(v.begin(), v.end(), 0)/v.size() | |
标准差 | double variance = 0; for (int i : vec) { variance += pow(i - mean, 2); } double stdev = sqrt(variance / vec.size()); | |
中值 | std::sort(vec.begin(), vec.end()); double median; if (vec.size() % 2 == 0) { median = static_cast<double>(vec[vec.size() / 2 - 1] + vec[vec.size() / 2]) / 2; } else { median = vec[vec.size() / 2]; } | |
最大值 | auto max_element = std::max_element(vec.begin(), vec.end());//返回的是迭代器 int max_value = *max_element;//加*就得到最大值 | |
最大值索引 | int max_index = std::distance(vec.begin(), max_element); | |
最小值 | auto min_element = std::min_element(vec.begin(), vec.end());//返回的是迭代器 int min_value = *min_element;//加*得到最小值 | |
最小值索引 | int min_index = std::distance(vec.begin(), min_element); | |
排序 | std::sort(vec.begin(), vec.end()) | |
等差数列 | int start = 1; int diff = 1; int length = 10; std::vector<int> vec; for (int i = 0; i < length; i++) { vec.push_back(start + i * diff); } | |
反转 | reverse(v.begin(),v.end()); |
9 代码示例
代码对应VS工程文件: