vector 的底层为顺序表(数组)。vector
vector
本文作者原创,转载请附上文章出处与本文链接。
C++ STL vector容器(深入了解,一文学会)目录
1 vector 容器的成员函数
2 构造函数
3 增加函数
4 删除函数
5 判断函数
6 大小函数
7 其它函数
8 使用方法
8.1 使用方法
8.2 升序降序
8.3 访问 & 定义
8.4 初始化
9 vector容器的底层实现机制
函数成员 | 函数功能 |
---|---|
begin() | 返回指向容器中第一个元素的迭代器。 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 |
rbegin() | 返回指向最后一个元素的迭代器。 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
size() | 返回实际元素个数。 |
max_size() | 返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。 |
resize() | 改变实际元素的个数。 |
capacity() | 返回当前容量。 |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 |
reserve() | 增加容器的容量。 |
shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小。 |
operator[ ] | 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。 |
at() | 使用经过边界检查的索引访问元素。 |
front() | 返回第一个元素的引用。 |
back() | 返回最后一个元素的引用。 |
data() | 返回指向容器中第一个元素的指针。 |
assign() | 用新元素替换原有内容。 |
push_back() | 在序列的尾部添加一个元素。 |
pop_back() | 移出序列尾部的元素。 |
insert() | 在指定的位置插入一个或多个元素。 |
erase() | 移出一个元素或一段元素。 |
clear() | 移出所有的元素,容器大小变为 0。 |
swap() | 交换两个容器的所有元素。 |
emplace() | 在指定的位置直接生成一个元素。 |
emplace_back() | 在序列尾部生成一个元素。 |
本程序使用MFC来做示例,MFC和C++基本一样。
.h
#include
#include
using namespace std;
.cpp
void CMFCApplication1Dlg::OnBnClickedButton4()
{
vectorv_int;
CString strText = "";
int intSize = 0;
// push_back(elem)在数组最后添加数据
for (int i = 0; i < 10; i++)
{
v_int.push_back(i);
}
//去掉数组最后五个数据
for (int i = 0; i < 5; i++)
{
v_int.pop_back();
}
//size()容器中实际数据个数
intSize = v_int.size();
//清空容器
v_int.clear();
}
.h
#include
.cpp
//insert():插入元素到Vector中
v_int.insert(v_int.begin() + 3, 100); //将 10 插入到下标为3的位置
//从小到大
sort(v_int.begin(), v_int.end());
//sort 从小到大
for (int i = 0; i < v_int.size(); i++)
{
v_int;
}
//从大到小
reverse(v_int.begin(), v_int.end());//从大到小
for (int i = 0; i < v_int.size(); i++)
{
v_int;
}
.cpp
//直接数组访问
for (int i = 0; i < 10; i++)//方法一
{
v_int[i];
}
//迭代器访问
vector::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
for (it = v_int.begin(); it != v_int.end(); it++)
{
*it;
}
int N = 5, M = 6;
vector > obj(N); //定义二维动态数组大小5行
for (int i = 0; i < obj.size(); i++)//动态二维数组为5行6列,值全为0
{
obj[i].resize(M);
}
for (int i = 0; i < obj.size(); i++)//输出二维动态数组
{
for (int j = 0; j < obj[i].size(); j++)
{
obj[i][j];
}
}
vector > objs(N, vector(M)); //定义二维动态数组5行6列
for (int i = 0; i < objs.size(); i++)//输出二维动态数组
{
for (int j = 0; j < objs[i].size(); j++)
{
objs[i][j];
}
}
//除了创建空 vector 容器外,还可以在创建的同时指定初始值以及元素个数,比如
vector primes{ 2, 3, 5, 7, 11, 13, 17, 19 };
//在创建 vector 容器时,也可以指定元素个数:
//圆括号 () 和大括号 {} 是有区别的,前者(例如 (20) )表示元素的个数,而后者(例如 {20} ) 则表示 vector 容器中只有一个元素 20。
vector values(20);
vector values(20, 1.0);
int num = 20;
double value = 1.0;
vector values(num, value);
//通过存储元素类型相同的其它 vector 容器,也可以创建新的 vector 容器
std::vectorvalue1(5, 'c');
std::vectorvalue2(value1);
int array[] = { 1,2,3 };
std::vectorvalues(array, array + 2);//values 将保存{1,2}
std::vectorvalue1{ 1,2,3,4,5 };
std::vectorvalue2(std::begin(value1), std::begin(value1) + 3);//value2保存{1,2,3}
作者建议还是稍微看一下底层机制,vector主要有三个指针(迭代器) 来表示的:
对于空的 vector 容器,由于没有任何元素的空间分配,因此 _Myfirst、_Mylast 和 _Myend 均为 null。
vector扩容本质
另外需要指明的是,当 vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:
这也就解释了,为什么 vector 容器在进行扩容后,与其相关的指针、引用以及迭代器可能会失效的原因。
由此可见,vector 扩容是非常耗时的。为了降低再次分配内存空间时的成本,每次扩容时 vector 都会申请比用户需求量更多的内存空间(这也就是 vector 容量的由来,即 capacity>=size),以便后期使用。
vector 容器扩容时,不同的编译器申请更多内存空间的量是不同的。以 VS 为例,它会扩容现有容器容量的 50%。
以下博客部分内容借鉴自:http://c.biancheng.net/stl/。
C++ STL 容器、迭代器、适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120052137 C++ STL deque容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118676574
C++ STL vector容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118676109
C++ STL list容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118676917
C++ STL forward_list容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118687348
C++ STL array 容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118688364
C++ STL pair 类模板(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118714852
C++ STL map容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118741670
C++ STL map emplace()和emplace_hint()(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118771777
C++ STL multimap容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118773021
C++ STL Set容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/118918940
C++ STL multiset容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119624779
C++ STL unordered_map容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119689199
C++ STL unordered_set容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119709019
C++ STL unordered_multiset容器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119709079
C++ STL stack容器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119723782
C++ STL queue容器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119746246
C++ STL priority_queue容器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119770527
C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119814820
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119834378
C++ STL stream_iterator流迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119834429
C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119850048
C++ STL move_iterator移动迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/119859888
C++ STL advance()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008250
C++ STL distance()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008300
C++ STL iterator迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008346
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008324
C++ STL begin()和end()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008459
C++ STL prev()和next()函数(深入了解,一文学会) https://blog.csdn.net/qq_37529913/article/details/120008481