0
点赞
收藏
分享

微信扫一扫

vector的常用操作详解


主要记录一些比较常见的用法

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)可以求的后继


举报

相关推荐

0 条评论