Skip to content

vector

vector 是封装动态数组的序列容器,它可以方便地扩大或者缩小数组的大小,插入或删除元素(当然这意味着 vector 通常会占用多于静态数组的空间,因为要分配更多内存以管理将来的增长)

environment

下面的示例代码均在该代码框架下运行,若有特定的函数库会另外写出

template.cpp
#include <iostream>
#include <vector>
#include <string>

using namespace std; 

int main() {
    // example code here; 
    return 0; 
}

vector 的创建以及初始化

可以使用类似于数组的方式初始化 vector

initialize1.cpp
vector<int> vec1 = {1, 2, 3, 4}; 

可以一次性初始化多个相同的元素

initialize2.cpp
vector<int> vec2(5, 0);     // {0, 0, 0, 0, 0} 

可以通过另外一个 vector 来初始化

initialize3.cpp
vector<int> vec3(vec2.begin(), vec2.end()); // {0, 0, 0, 0, 0}
vector<int> vec4(vec2);                     // {0, 0, 0, 0, 0}

可以通过迭代器的性质通过另外一个 vector 的部分内容来初始化

initialize4.cpp
vector<int> vec5(vec2.begin(), vec2.begin() + 2); // {0, 0}
// 注意是左闭右开区间

元素访问

[] & at

你可以直接把 vector 的元素访问看作数组的访问,使用 [] 操作符;当然,你也可以使用 at 函数

visit1.cpp
vector<string> vec = {"Nice", "to", "meet", "you"}; 
cout << vec[0] << endl;     // "Nice"
cout << vec.at(0) << endl;  // "Nice"
[] 和 at 的不同

对于 at 函数,如果访问到越界的下标会抛出 std::out_of_range 的错误;

而对于 [] 操作符,如果访问到越界的下标是 未定义行为

front & back

访问第一个元素可以使用 front 函数,访问最后一个元素可以使用 back 函数

visit2.cpp
vector<string> vec = {"Nice", "to", "meet", "you"}; 
cout << vec.front() << endl;     // "Nice"
cout << vec.back() << endl;      // "you"

迭代器

vector 有 begin, end, rbegin, rend 等迭代器;其中 begin 是指向第一个元素的迭代器,而 end 是指向最后一个元素的 后一个元素 迭代器

begin&end

iterator.cpp
# include <algorithm>

vector<string> vec = {1, 2, 3, 4, 5}; 

// 求和
int sum = accumulate(vec.begin(), vec.end(), 0); 
cout << sum << endl; // 15

// 打印 vec
for_each(vec.begin(), vec.end(), [](const int num) {
    cout << num << '-'; 
});
// 1-2-3-4-5-

rbegin 是指向逆向的 vector 的首元素的逆向迭代器,即对应 vector 最后一个元素;rend 是指向逆向的 vector 的末元素后一元素的逆向迭代器,即对应 vector 首元素的 前一元素

rbegin&rend

print the reversed vector.cpp
vector<string> vec = {1, 2, 3, 4, 5}; 

// 反向打印 vec
for_each(vec.rbegin(), vec.rend(), [](const int num) {
    cout << num << '-'; 
});
// 5-4-3-2-1-

属性查询函数

empty

返回 vector 是否为空

isEmpty.cpp
vector<int> vec; 

cout << vec.empty() << endl;    // true

vec.push_back(13); 

cout << vec.empty() << endl;    // false

size

返回 vector 中的元素个数

getSize.cpp
vector<int> vec; 

cout << vec.size() << endl;    // 0

vec.push_back(13); 

cout << vec.size() << endl;    // 1

修改函数

push_back

在 vector 末尾插入新的元素

push.cpp
vector<int> vec(3, 0);          // {0, 0, 0}
vec.push_back(1);               // {0, 0, 0, 1}
vec.push_back(2);               // {0, 0, 0, 1, 2}

emplace_back

在 vector 末尾插入新的元素

emplace.cpp
vector<int> vec(3, 0);          // {0, 0, 0}
vec.emplace_back(1);               // {0, 0, 0, 1}
vec.emplace_back(2);               // {0, 0, 0, 1, 2}
Tip

emplace_back 在 C++11 添加,相较于 push_back 效率上有一定提升;emplace_back 最大的作用是避免产生不必要的临时变量;详情参考 https://zh.cppreference.com/w/cpp/container/vector/emplace_back

insert

  1. 使用 vector.insert(iterator pos, value, cnt) 可以在 pos 迭代器前对应位置插入对应 value
  2. 使用 vector.insert(iterator pos, value, cnt) 可以在 pos 迭代器前对应位置插入 cnt 个对应 value
  3. 使用 vector.insert(iterator pos, iterator left, iterator right) 可以在 pos 迭代器前对应位置插入 [left, right) 迭代器区间的值;注意是左闭右开区间
insert.cpp
vector<int> vec(3, 0);                              // {0, 0, 0}

vec.insert(vec.begin(), 1);                         // {1, 0, 0, 0}

vec.insert(vec.end(), 2, 2);                        // {1, 0, 0, 0, 2, 2}

vector<int> temp(3, 3);                             // {3, 3, 3}

vec.insert(vec.begin(), temp.begin(), temp.end());  // {3, 3, 3, 1, 0, 0, 0, 2, 2}

pop_back

移除 vector 的末尾元素

pop_back.cpp
vector<int> vec = {0, 1, 2, 3}; 

vec.pop_back();     // {0, 1, 2}

vec.pop_back();     // {0, 1}

clear

清空 vector 中的所有元素

clear.cpp
vector<int> vec = {1, 2, 3}; 

cout << vec.size() << endl;     // 3

vec.clear();

cout << vec.size() << endl;     // 0

erase

  1. 使用 vector.erase(iterator pos) 可以通过指定对应位置的迭代器删除对应元素
  2. 使用 vector.erase(iterator left, iterator right) 可以通过指定对应范围 [left, right)的迭代器删除对应元素;注意是 左闭右开 区间
erase.cpp
vector<string> vec = {"Nice", "to", "meet", "you"}; 

vec.erase(vec.begin() + 2, vec.end());    //  {"Nice", "to"}

vec.erase(vec.begin());                   // {"to"}