C++ Vector
c++ vector
简介
vector 是顺序容器的一种,vector 是可变长的动态数组(可存放任意类型),支持随机访问迭代器。所有 STL 算法都能对 vector 进行操作,要使用 vector,需要包含头文件 vector
优点
因其拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符。
根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多情况下也是常数,总体来说速度很快
缺点
若要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低
在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比
函数列表
Constructors 构造函数
Operators 对 vector 中的元素赋值或比较
assign() // 对 vector 中的元素赋值
at() // 返回指定元素的位置
back() // 返回最后一个元素
begin() // 返回第一个元素的迭代器
capacity() // 返回 vector 所能容纳的元素数量(在不重新分配内存的情况下)
clear() // 清空所有元素
empty() // 判断 vector 是否为空(空返回 true)
end() // 返回最末元素的迭代器(实指向最末元素的下一个位置)
erase() // 删除指定元素
front() // 返回第一个元素
get_allocator() // 返回 vector 的内存分配器
insert() // 插入元素到 vector 中
max_size() // 返回 vector 所能容纳元素的最大数量(上限)
pop_back() // 移除最后一个元素
push_back() // 在 vector 最后添加一个元素
rbegin() // 返回 vector 尾部的逆迭代器
rend() // 返回 vector 起始的逆迭代器
reserve() // 设置 vector 最小的元素容纳数量
resize() // 改变 vector 元素数量的大小
size() // 返回 vector 元素数量的大小
seap() // 交换两个 vector
函数详解
构造函数
语法:
vector() // 无参构造函数,将容器初始化为空
vector(int n) // 将容器初始化为有 n 个元素
vector(int n, const T & val) // 假定元素类型为 T,此构造函数将容器初始化为有 n 个元素,每个元素的值都是 val
案例
assign 函数
语法:
void assign(input_iterator first, input_iterator last); // 将区间[first, last)的元素赋值到当前 vector
void assign(size_type num, const TYPE & val); // 赋 num 个值为 val 的元素到 vector 中
assign 函数会清除掉为 vector 赋值以前的内容
案例
at 函数
语法:
TYPE at(size_type loc); // 返回当前 vector 指定位置 loc 的元素的引用
at()函数比[]运算符更安全,at()不会让你访问到 vector 内越界的元素
案例 1
erase 函数
语法:
iterator erase(iterator loc); //删除指定位置 loc 的元素
iterator erase(iterator first, iterator last); // 删除区间[first, last)的所有元素
erase 函数返回值是指向删除的最后一个元素的下一位置的迭代器
案例
get_allocator 函数
语法:
allocator_type get_allocator();
get_allocator() 函数返回当前 vector 的内存分配器.在 STL 里面一般不会 new 或者 alloc 来分配内存,而是通过一个 allocator 对象的相关方法来分配
案例
insert 函数
语法:
iterator insert(iterator loc, const TYPE & val); // 在指定位置 loc 前插入值为 val 的元素,返回指向这个元素的迭代器
void insert(iterator loc, size_type num, const TYPE & val); // 在指定位置 loc 前插入 num 个数值为 val 的元素
void insert(iterator loc, input_iterator first, input_iterator last); // 在指定位置 loc 前插入区间[first, last)的所有元素
案例
max_size 函数
语法:
size_type max_size();
max_size() 函数返回当前 vector 所能容纳元素数量的最大值(注:包括可重新分配内存)
pop_back() 函数
语法:
void pop_back(); // 删除当前 vector 最末的一个元素
案例
rbegin 函数
语法:
reverse_iterator rbegin(); // 返回指向当前 vector 末尾的逆迭代器(实际指向末尾的下一位置,而其实际内容为末尾元素的值)
案例
rend 函数
语法:
reverse_iterator rend(); // 返回指向当前 vector 起始位置的逆迭代器
案例
reserve 函数
语法:
void reserve(size_type size); // 设置为当前 vector 预留至少共容纳 size 个元素的空间(注:实际空间可能大于 size)
resize 函数
语法:
void resize(size_type size, TYPE val); // 改变当前 vector 的大小为 size,且对新创建的元素赋值 val
resize 与 reserve 的区别
reserve 是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用 push_back()/insert() 函数
resize 是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的对象时,用 operator[]操作符,或者用迭代器来引用元素对象,
resize 就是重新分配大小,reserve 就是预留一定的空间
附:reverse 与 resize 接口源码
size 函数
语法:
size_type size(); // 返回当前 vector 所容纳元素的数量
swap 函数
语法:
void swap(vector & from); // 交换当前 vector 与 vector from 的元素
案例
vector 用法
vector 基本用法案例
vector 还可以嵌套以形成可变长的二维数组
vector 的元素不仅仅可以是 int,double,string,还可以是结构体,但是要注意:结构体定义为全局的,否则会出错
案例
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/e2ebdf033b3c87cd9b26c4281】。文章转载请联系作者。
评论