C++ STL vector容器(深入了解,一文学会)

        vector 的底层为顺序表(数组)。vector (泛型) 容器是包含 T 类型元素的序列容器,和 array 容器相似,不同的是 vector 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或添加元素。
        vector 容器可以方便、灵活地代替数组。在大多数时候,都可以用 vector 代替数组存放元素。只要能够意识到,vector 在扩展容量,以 及在序列内部删除或添加元素时会产生一些开销;但大多数情况下,代码不会明显变慢。 为了使用 vector 容器模板,需要在代码中包含头文件 #include

C++ STL vector容器(深入了解,一文学会)_第1张图片

 本文作者原创,转载请附上文章出处与本文链接。

C++ STL vector容器(深入了解,一文学会)目录

1  vector 容器的成员函数

2 构造函数

3 增加函数

4 删除函数

5 判断函数

6 大小函数

7 其它函数

8 使用方法

 8.1 使用方法

 8.2 升序降序

 8.3 访问 & 定义

 8.4 初始化

9 vector容器的底层实现机制


1  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() 在序列尾部生成一个元素。

2 构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

3 增加函数

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

4 删除函数

  • iterator erase(iterator it):删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • void pop_back():删除向量中最后一个元素
  • void clear():清空向量中所有元素

5 判断函数

  • bool empty() const:判断向量是否为空,若为空,则向量中无元素

6 大小函数

  • int size() const:返回向量中元素的个数
  • int capacity() const:返回当前向量张红所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值

7 其它函数

  • void swap(vector&):交换两个同类型向量的数据
  • void assign(int n,const T& x):设置向量中第n个元素的值为x
  • void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

8 使用方法

        本程序使用MFC来做示例,MFC和C++基本一样。

C++ STL vector容器(深入了解,一文学会)_第2张图片

 8.1 使用方法

.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();


}

C++ STL vector容器(深入了解,一文学会)_第3张图片C++ STL vector容器(深入了解,一文学会)_第4张图片

 C++ STL vector容器(深入了解,一文学会)_第5张图片

 8.2 升序降序

.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;
}

C++ STL vector容器(深入了解,一文学会)_第6张图片C++ STL vector容器(深入了解,一文学会)_第7张图片

 C++ STL vector容器(深入了解,一文学会)_第8张图片

 8.3 访问 & 定义

.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];
		}
	}

C++ STL vector容器(深入了解,一文学会)_第9张图片C++ STL vector容器(深入了解,一文学会)_第10张图片

 8.4 初始化

	//除了创建空 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}

9 vector容器的底层实现机制

 作者建议还是稍微看一下底层机制,vector主要有三个指针(迭代器) 来表示的:

  • _Myfirst 和 _Mylast 可以用来表示 vector 容器中目前已被使用的内存空间;
  • _Mylast 和 _Myend 可以用来表示 vector 容器目前空闲的内存空间;
  • _Myfirst 和 _Myend 可以用表示 vector 容器的容量。

C++ STL vector容器(深入了解,一文学会)_第11张图片

 对于空的 vector 容器,由于没有任何元素的空间分配,因此 _Myfirst、_Mylast 和 _Myend 均为 null。

vector扩容本质

另外需要指明的是,当 vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:

  1. 完全弃用现有的内存空间,重新申请更大的内存空间;
  2. 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;
  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
 

你可能感兴趣的:(#,C++,STL,容器,迭代器,适配器,c++,数据结构)