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 代码示例
#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{//创建vector<int> b = { 3,7,13,4,15,26,17 };//创建常量vector<int>a;//创建一个空数组cout << a.size() << endl;//长度为0a.assign(4, 2);//创建长度为4,值全为2的常量vector<int>c(10);//创建一个固定长度,值全为0的数组cout << c.size() << endl;//长度为10//增加a.insert(a.begin() + 0, 5);//在起始位置增加一个元素int i = 2;//元素的序号a.insert(a.begin() + i, 6);//在中间位置增加一个元素a.push_back(5);//在末尾位置增加一个元素a.insert(a.begin() + 0, b.begin(), b.end());//在起始位置增加一段元素a.insert(a.begin() + i, b.begin(), b.end());//在中间位置增加一段元素a.insert(a.end(),b.begin(), b.end());//在末尾位置增加一段元素//删除a.erase(a.begin() , a.begin() + 1);//删除第一个元素a.pop_back();//删除最后一个元素a.erase(a.begin()+i-1, a.begin() + i);//删除第i个元素cout <<a.size()<< endl;int length = 4;a.erase(a.begin() , a.begin()+length);//删除开始位置长度固定的元素a.erase(a.begin() + i - 1, a.begin() + i + length - 1);//删除中间段(第i个位置)长度固定的元素a.erase(a.end() -length, a.end());//删除末尾位置长度固定的元素a.clear();//删除全部的元素a.assign(10, 2);//创建长度为4,值全为2的常量//修改a[0] = 100;//修改第一个元素a[i] = 200;//修改第i个元素a.back() = 300;//修改最后一个元素for_each(a.begin(), a.end(), [](auto elem) { std::cout << elem << " "; });cout << endl;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());//修改最后一段元素//查找int target = 7;for_each(a.begin(), a.end(), [](auto elem) { std::cout << elem << " "; });cout << endl;//查找等于第一个索引int index;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;}}vector<int> all_index;//查找所有for (int i = 0; i < a.size(); i++) {if (a[i] == target) {all_index.push_back(i);}}cout << "dayu" << endl;//查找大于值第一个索引for (int i = 0; i < a.size(); i++) {if (a[i] > target) {index = i;break;}}cout << index << endl;//查找大于某个值的最后一个索引for (int i = 0; i < a.size(); i++) {if (a[i] > target) {index = i;}}cout << index << endl;//查找大于某个值的所有索引all_index.clear();//清空for (int i = 0; i < a.size(); i++) {if (a[i] > target) {all_index.push_back(i);}}for_each(all_index.begin(), all_index.end(), [](auto elem) { std::cout << elem << " "; });cout << endl;cout <<"小于"<< endl;//查找小于值第一个索引for (int i = 0; i < a.size(); i++) {if (a[i] < target) {index = i;break;}}cout << index << endl;//查找小于某个值的最后一个索引for (int i = 0; i < a.size(); i++) {if (a[i] < target) {index = i;}}cout << index << endl;//查找小于某个值的所有索引all_index.clear();//清空for (int i = 0; i < a.size(); i++) {if (a[i] <= target) {all_index.push_back(i);}}for_each(all_index.begin(), all_index.end(), [](auto elem) { std::cout << elem << " "; });cout << endl;//其它一些操作vector<int>e;e.assign(a.begin(), a.begin() + 3);cout << a.empty()<<endl; //判断a是否为空,空则返回true,非空则返回falsesort(a.begin(), a.end());//从小到大排序reverse(a.begin(), a.end());//倒序for_each(a.begin(), a.end(), [](auto elem) { std::cout << elem << " "; });cout << endl;int test[5] = { 1,2,3,4,5 };cout << sizeof(test)/sizeof(int) << endl;return 0;
}
相关链接:
数组常用操作对照表——matlab和C++(vector)_c++ matlab vector-CSDN博客