深度解析C++ STL容器vector原理及用法

Posted 紫荆鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度解析C++ STL容器vector原理及用法相关的知识,希望对你有一定的参考价值。

std::vector

返回目录(建议收藏)【目录】全面理解C++ STL标准模板库

原理代码

template <class T,class Alloc=allocator<T>> class vector; 
// generic template

vector概念

vector是表示可以改变大小的数组的序列容器.
就像数组一样,向量为它们的元素使用连续的存储位置,这意味着它们的元素也可以使用指向其元素的常规指针上的偏移量来访问,并且与在数组中一样有效. 但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。

0.头文件

#include<vector>

1.定义vector的方式

(1)常见定义方式

std::vector<int> vitem11,2,3,4;	//1.直接赋值

int a[5] = 1,3,6,8,4;
std::vector<int> vitem2(a,a+5);		//2.数组赋值

std::vector<int> vitem3;			//3.vector容器的默认构造 
for(int i=0;i<50;i+=5)vitem3.push_back(i); //方法一
vitem3.assign(10,66);  //方法二

std::vector<int> vitem4(vitem4.begin(),vitem4.end()); //4.区间进行构造

std::vector<int> vitem5(5,6);		//5.n个elem进行构造

std::vector<int> vitem6(vitem5);	//6.拷贝构造

(2)案例分析

案例代码

结果输出

2.vector输出函数

(1)使用计数器打印vector容器

//方式一:使用计数器打印vector容器
void my_print2(vector<int>&v)

	for (unsigned i=0; i<v.size() ; i++)
    std::cout << ' ' << v[i];

(2)通过迭代器输出

//方式二:迭代器打印vector容器 
void my_print(vector<int>&v)

	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
	
		std::cout<<(*it)<<" ";
	
	std::cout<<endl;

(3)使用auto/typedef/type alias

注:这种方法原理就是使用迭代器,auto在这就是指的是迭代器类型

//方式三:使用auto/typedef/type alias
for (auto i = path.begin(); i != path.end(); i++) 
    std::cout << *i << ' ';

(4)使用range-base

注:这种方法就是方法三的变形式,同样是使用迭代器输出

//方式四:range-base 循环
for (auto i : path)
    std::cout << i << ' ';

3.vector的成员函数

(1)vector::assign

函数功能:将新内容分配给vector,替换其当前内容,并相应地修改其大小。

template <class InputIterator>
(1)void assign (InputIterator first, InputIterator last);//新内容是由first和last之间范围内的每个元素按相同顺序构造的元素。
(2)void assign (size_type n, const value_type& val);//新内容是n 个元素,每个元素都初始化为val的副本

举例代码:

结果输出

(2)vector::at

函数功能:返回对向量中位置n处元素的引用。
举例代码:

结果输出

(3)vector::back

函数功能:返回对向量中最后一个元素的引用。
与成员vector::end不同,它返回一个刚刚经过这个元素的迭代器,这个函数返回一个直接引用。在空容器上调用此函数会导致未定义的行为。
举例代码:

结果输出

(4)vector::begin

函数功能:返回指向向量中第一个元素的迭代器
例子代码

结果输出

(5)vector::end

函数功能:返回指向向量中最后一个元素的迭代器
例子代码
结果输出

(6)vector::capacity

函数功能:返回当前为vector分配的存储空间的大小,以元素表示。
例子代码

(6)vector::size

函数功能:返回当前为vector分配的存储空间的大小,以元素表示。
例子代码

结果输出:见(6)

(8)vector::max_size

函数功能:返回当前为vector分配的存储空间的大小,以元素表示。
例子代码

结果输出:见(6)

(9)vector::resize

函数功能:调整容器大小,使其包含n 个元素。
例子代码
结果输出

(10)vector::clear

函数功能:从向量中移除所有元素(被销毁),留下大小为0的容器。
例子代码
结果输出

(11)vector::push_back

函数功能:在vector的末尾添加一个新元素,在其当前最后一个元素之后。
例子代码:见(10)
结果输出见(10)

(12)vector::pop_back

函数功能:删除vector 中的最后一个元素,有效地将容器大小减少一。

(13)vector::insert

函数功能:通过在指定的插入元件之前新元素扩展位置,有效地增加了容器的尺寸由插入元件的数量。
例子代码
结果输出

(14)vector::empty

函数功能:返回向量是否为空(即其大小是否为0)。

(15)vector::swap

函数功能:返回当前为vector分配的存储空间的大小,以元素表示。
例子代码
结果输出

(16)其他函数

【传送门】
vector::cbegin
vector::cend
vector::crbegin
vector::crend
vector::data
vector::emplace
vector::emplace_back、
vector::front
vector::get_allocator
vector::operator=
vector::reserve
vector::shrink_to_fit
vector::rend
vector::rbegin
vector::operator[]
vector::erase

附录

成员类型

以上是关于深度解析C++ STL容器vector原理及用法的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现2: 如何使用std::vector

C++ STL应用与实现2: 如何使用std::vector

C++ STL应用与实现2: 如何使用std::vector

C++ STL 线性容器的用法

STL:vector内部实现原理及基本用法

容器(vector)和指针(ptr)的区别