如果看这篇博客感觉说的不是很深,我有在另一篇博客中详细的(从STL源码上)剖析了vector, 有兴趣的可以看看 STL源码剖析vector
一个矢量类 vector
声明
头文件: #include
vector + <参数列表> + 名字;
例 :vector< int> vec;
参数列表里可存放的类型:
容器的数据类型: string 等.
基本数据类型: int,double 等.
结构体 ,对象 等.
vector类 重载了 下标运算符— [] ,所以vector 可以进行下标运算
vector 的五中构造函数
第一种: 创建一个名为 v0,类型为 int型,大小 为0的对象
std::vector<int> v0;
第二种:创建一个大小为 3,内容为 0 的对象
std::vector<int> v1(3);
第三种:创建一个 大小为5, 5 个的值都为 2的对象
std::vector<int> v2(5, 2);
第四种:// 创建一个向量v3,其中包含3个值为1的元素,以及向量v2的分配器
std::vector<int> v3(3, 1, v2.get_allocator());
第五种:用 v2 初始化 v4
std::vector<int> v4(v2);
第六种: 用v4的 v4[1] 初始化到 v4[2]
std::vector<int> v5(v4.begin() + 1, v4.begin() + 3);
vector 的大小和容量.
这两个并不是同一个概念.
大小: 是 当前对象所具有的元素的个数.
容量:是 当前对象所能容纳素数的 最大个数.
方法 | 作用 |
---|---|
size() | 返回容器的大小 |
empty() | 判断容器是否为空 |
max_size() | 返回容器最大的可以存储的元素 |
capacity() | 返回容器当前能够容纳的元素数量 |
resize() | 可以改变容器大小 |
reserve() | 设置Vector最小的元素容纳数量 |
vector 的一个好处就是当对象的容量不够时,可以动态增加.
而一个vec 对象的初始容量则是 初始化时定的.
不同的编译器的操作不同.
当空间不够时,申请新的空间的大小为已存在元素的个数的 2 倍.( g++ 下测试的).
迭代器: vector::iterator it;
这里的迭代器相当于指针,可以用 *it 运算.
vec.begin() 返回头迭代器
vec.end() 返回尾迭代器
头文件 #include
这有个很好用的函数–for_each();
for_each(头迭代器,尾迭代器,函数名);
方法 | 作用 |
---|---|
push_back() | 尾部插入 |
insert(vec.begin()+i,a) | 在第i个元素后面插入a |
erase(vec.begin()+2) | 删除第3个元素 |
erase(vec.begin()+i,vec.end()+j) | 删除区间[i,j-1];区间从0开始 |
clear() | 清空之后 |
pop_back() | 移除最后一个元素 |
get_allocator() | 返回vector的内存分配器 |
at() | 返回指定位置的元素 |
swap() | 交换两个Vector |
front() | 返回第一个元素的值 |
back() | 返回最后一个元素的值 |
算法:
3 算法
(1) 使用reverse将元素翻转:需要头文件#include
reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,
一般后一个都不包含.)
(2)使用sort排序:需要头文件#include,
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
参考博客 : https://blog.csdn.net/msdnwolaile/article/details/52708144