主要记录一些比较常见的用法
vector的插入
- v.push_back(x)
往vector的末尾插入一个元素x
只有一个参数时只能用push_back不能用insert
vector的insert几种携参用法中并没有一个参数的,都是两个参数或三个参数
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
for (auto i : v) cout << i << " ";
output:1 2 3 4 5
- v.insert(v.begin() + x, y)
往这个位置的后面插入一个元素
注意前面一定要加v.begin()这个指针
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
v.insert(v.begin() + 2, 10);
for (auto i : v) cout << i << " ";
output:1 2 10 3 4 5
- v.insert(v.begin() + x, y, z)
往这个位置的后面加入
个
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
v.insert(v.begin() + 2, 3, 10);
for (auto i : v) cout << i << " ";
output:1 2 10 10 10 3 4 5
- v.insert(v.begin() + x, a + y, a + z)
往这个位置的后面加入
数组的
到
这些元素
vector<int> v; int a[5];
for (int i = 1; i <= 5; i++) v.push_back(i);
for (int i = 0; i < 5; i++) a[i] = i + 10;
v.insert(v.begin() + 2, a + 1, a + 3);
for (auto i : v) cout << i << " ";
output:1 2 11 12 3 4 5
- v.insert(lower_bound(v.begin(), v.end(), x), x)
插入时直接保证vector有序
vector的删除
- v.erase(v.begin() + x)
将号元素删除,如果
为空就是删除队首v.begin()
或者用v.erase(v.end())删除队尾
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
v.erase(v.begin() + 1);
for (auto i : v) cout << i << " ";
output:1 3 4 5
- v.erase(v.begin() + x, v.end() - y)
就是从哪个位置开始删除,这两个加减应该分开写
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
v.erase(v.begin(), v.end() - 2);
for (auto i : v) cout << i << " ";
output:4 5
v.clear();
for (int i = 1; i <= 5; i++) v.push_back(i);
v.erase(v.begin() + 2, v.end());
for (auto i : v) cout << i << " ";
output:1 2
- v.erase(v.begin() + x, v.begin() + y)
删除这个区间,一定注意stl都是左闭右开
for (int i = 1; i <= 5; i++) v.push_back(i);
v.erase(v.begin() + 2, v.begin() + 3);
for (auto i : v) cout << i << " ";
output:1 2 4 5
- v.erase(lower_bound(v.begin(), v.end(), x))
对有序的vector删除指定元素x - v.clear()
清空vector
vector的输出
- v.at(x)
输出x位置的元素,注意下标从零开始
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
cout << v.at(2);
output:3
- v[x]
与上面一样,vector是唯一定义了[]的stl
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
cout << v[2];
output:3
- v.back(); v.front()
输出队尾元素或队首元素的值
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
cout << v.front() << " " << v.back();
output:1 5
vector的修改
- v.assign(v1.begin() + x, v1.begin() + y)
把的
到
位置赋给
vector<int> v, v1;
for (int i = 1; i <= 5; i++) v.push_back(i);
v1.assign(v.begin() + 2, v.end());
for (auto i : v1) cout << i << " ";
output:3 4 5
- v.pop_back()
弹出最后一个元素
还有就是通过上面的操作来找到元素位置再通过[]修改,不再一一赘述
vector的遍历
- 用最普通的迭代器遍历
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) cout << *it << " ";
output:1 2 3 4 5
- 用auto来自动选择类型(c++11特性)
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
for (auto it = v.begin(); it != v.end(); it++) cout << *it << " ";
output:1 2 3 4 5
- 另外一种c++11的遍历方法
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
for (auto it : v) cout << it << " ";
output:1 2 3 4 5
- 用stl的for_each遍历
vector<int> v;
for (int i = 1; i <= 5; i++) v.push_back(i);
for_each(v.begin(), v.end(), [](int x) {cout << x << " ";});
output:1 2 3 4 5
其实这第三个参数本质上是lambda表达式,或者还可以写一个函数,比如:
void print(int x) {cout << x << " ";}
for_each(v.begin(), v.end(), print);
关于vector的lower_bound
lower_bound的前提条件是数组是有序的
这就是为什么set自带一个lower_bound函数而vector等其他stl没有
直接lower_bound(v.begin(), v.end(), x)是返回一个迭代器
lower_bound(v.begin(), v.end(), x) - v.begin()才是返回x所在的位置
*–lower_bound(v.begin(), v.end(), x)可以求的前驱(小于x)
*upper_bound(v.begin(), v.end(), x)可以求的后继