C++ vector 容器学习笔记

本文整理自 http://www.cplusplus.com/reference/vector/vector/

Vector 是 C++ 中十分重要的一个容器类型。 官方文档给出的定义是: Vectors are sequence containers representing arrays that can change in size. 即可以改变大小的数组的序列容器。 要使用 vector 类,必须先包含头文件 vector:

1
#include <vector>

接下来我们来熟悉 Vector 类的常用成员函数:

  1. 构造函数

    1
    2
    3
    4
    5
    6
    7
    vector();  // 创建一个空的 vector
    vector(int nSize); // 创建一个元素个数为 nSize 的 vector
    vector(int nSIze, const value_type& value); // 创建一个元素个数为 nSize 的 vector,值均为 value
    vector(InputIterator first, InputIterator last); // 将另一个迭代器类型的[first, last) 复制到 vector 中
    vector(const vector& x); // 复制构造函数,复制已经存在的 vector

    ~vector() // 析构函数

  2. vector::operator=

    1
    2
    3
    4
    5
    6
    7
    8
    vector& operator= (const vector& x);  // 将 x 的所有元素复制到新容器中,x 元素保留
    vector& operator= (vector&& x); // 将 x 的所有元素移动到新容器中, x 处于未指定但有效的状态

    std::vector<int> foo (3,0);
    std::vector<int> bar (5,0);

    bar = foo;
    foo = std::vector<int>();

关于未指定但有效的状态: 当对象处于未指定状态时,我们可以对没有先决条件的对象执行任何操作。 如果有一个操作要执行的先决条件,我们不能直接执行该操作,因为我们不知道对象的 unspecified-state 是否满足先决条件。

一般没有前提条件的操作示例: - 销毁 - 赋值 - 像 get,empty,size 这样的常量观察者

有前提条件的操作示例: - 取消引用 * pop_back

  1. 迭代器类型
1
2
3
4
5
6
7
8
9
10
11
12
std::vector<int> myvector;  // 定义一个 空的 vector
for (int i=1; i<=100; i++) myvector.push_back(i); // 为 vector 添加元素

myvector.begin(); // 返回一个迭代器,它指向容器 vector 的第一个元素
myvector.end(); // 返回一个迭代器,它指向容器 vector 的最后一个元素的下一个位置
myvector.rbegin(); // 返回一个逆序迭代器,它指向容器 vector 的最后一个元素
myvector.rend(); // 返回一个逆序迭代器,它指向容器 vector 的第一个元素前面的位置
// 以下四个是上面四个的常量版本
myvector.cbegin();
myvector.cend();
myvector.crbegin();
myvector.crend();

关于反向迭代器的内容,见 https://blog.csdn.net/kjing/article/details/6936325

  1. 容量
1
2
3
4
5
6
7
8
9
10
11
12
myvector.size();  // 返回当前容器的容量大小  100
myvector.max_szie(); // 返回当前容器最大可承载的元素数量 1073741823
myvector.capacity(); // 返回容器分配的容量的大小 128

// 改变容器大小,使之为 n
myvector.resize(size type n); // 如果 n 比原来小,则保留前 n 位,删除后面的元素
myvector.resize((size_type n, const value_type& val); // 如果 n 比原来大,若提供 val,则填充;否则值初始化
// 若 n 比原来的 capacity 还大,则重新分配

myvector.empty(); // 返回容器 size 是否为空
myvector.reserve(size_type n); // 如果 n 比原来的 capacity 大,则 capacity 增大为 n,否则无变化
myvector.shrink_to_fit(); // 将容器的capacity 减小至与它的 size 相匹配,不会更改 size 和 value
  1. 获取元素
1
2
3
4
5
myvector[i];  // 返回 myvector 的第 i 个元素
myvector.at(i); // 返回对在 i 位置元素的一个引用
myvector.front(); // 返回对 myvector 首元素的引用
myvector.back(); // 返回对 myvector 末元素的引用
myvector.data(); // 返回一个直接访问 vector 内部元素的指针
  1. 修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
myvector.assign(InputIterator first, InputIterator last);  // 新 myvector 的值是可迭代对象的 [first, last)
myvector.assign(size_type n, const value_type& val); // 新 myvector 有 n 个元素,均为 val

myvector.push_back(value_type&& val); // 在 myvector 最后添加一个新元素,同时 size + 1
myvector.pop_back(value_type&& val); // 在 myvector 删除最后一个元素,同时 size - 1

myvector.insert(const_iterator position, const value_type& val); // 在 position 位置插入新值 val
myvector.insert(const_iterator position, size_type n, const value_type& val); // 在 position 位置插入 n 个新值 val
myvector.insert(const_iterator position, InputIterator first, InputIterator last); // 在 position 位置插入另一个迭代对象[first:last)

myvector,erase(const_iterator position); // 删除 position 位置的元素
myvector.erase(const_iterator first, const_iterator last); // 删除 [first,last) 范围的元素

myvector.swap(vector& x); // 交换,所有东西全部交换
myvector.clear(); // 清除 myvector 里的所有元素,只留一个空 vector

有关 allocator 的知识参见原网址。

# C++

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×