STL — vector容器用法详解

原创 2017年09月11日 22:33:52

vector容器用法详解

                                                                                          



vector容器作为STL常用容器之一它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始

的下标表元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和

缩小而自动变化本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为

了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任

务,因为每当一个新的元素加入到器的时候,vector并不会每次都重新分配大小。

vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同

库采用同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插

入一个元素的时候是在常数时间的复杂度完成的。

当然我们如果真正实现一个vector的时候我们对它的理解可能会更加的深刻,这个以后我应该会补充但是现在我们首先学

会如何来使用vector,我们先瞧瞧vector当中都有什么功能.


容器初始化

                                                                                                                                   


下面为初始化的各种形式,各种姿势任你解锁~

int main()
{

	vector<int> arr; 
	//声明一个int型变量.
	
	vector<int> arr1(10);
	// 声明一个初始大小为10的int对象.
	
	vector<int> arr2(10, 1);
	//声明一个初始大小为10且值都是1的对象.
	
	vector<int> arr3(arr); 
	//利用一个vector对象初始化自己
	
	vector<int> arr4(arr.begin(), arr.begin() + 3);
	//用对象arr的第0个到第2个值初始化arr4;
	
	int array[5] = { 1, 2, 3, 4, 5};
	vector<int> arr5(array, array + 5);
	//将array数组用于初始化arr5对象.
	
	vector<int> arr6(&array[1], &array[4]);
	//将array[1]~array[4]范围内的元素作为vec的初始值.
	
	return 0;

}



判断容器大小

                                                                                                                                                                                                                                                                    
具体有三个函数:

int size() const:返回容器中元素的个数

int capacity() const:返回当前容器所能容纳的最大元素值

int max_size() const:返回最大可允许的vector元素数量值


代码演示:

int Test()
{


	int array[5] = { 1, 2, 3, 4, 5 };

	vector<int> arr5(array, array + 5);

	cout << "该容器中的元素个数为:" << arr5.size() << endl;

	cout << endl;

	cout << "该容器当前的最大容量为:" << arr5.capacity() << endl;

	cout << endl;

	cout << "该容器最大可以允许vector的元素数量为:" << arr5.max_size() << endl;

	cout << endl;

	system("pause");

	return 0;
}



运行结果:





容器内添加元素

                                                                                                                                        

添加元素具有4个函数:

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

it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

代码演示:


1*****************

//第零种插入方法:直接在vector的最后一个元素后面插入数据
vector<int> arr;

arr.push_back(1);

arr.push_back(2);

arr.push_back(3);

arr.push_back(4);

vector<int>::iterator it;

it = arr.begin();

cout << "插入后的vector当中元素分别为: ";

for (it = arr.begin(); it < arr.end(); it++)
{
	cout << *it << " ";
}

cout << endl;


运行结果:





2*****************

//第一种插入方法:在vector中往it指向的节点前面插入单个数据
vector<int> arr(5, 1);

vector<int>::iterator it1;

it1 = arr.begin();

it1 = arr.insert(it1, 200);

cout << "插入后的vector当中元素分别为: ";

for (it1 = arr.begin(); it1 < arr.end(); it1++)
{
	cout << *it1 << " ";
}

cout << endl;


运行结果:





3*****************

//第二种插入方法:在vector中往it指向的节点前面n个数据.

vector<int> arr(5, 1);

vector<int>::iterator it2;

it2 = arr.begin();

arr.insert(it2, 2, 300);

cout << "插入后的vector当中元素分别为: ";

for (it2 = arr.begin(); it2 < arr.end(); it2++)
{
	cout << *it2 << " ";
}

cout << endl;


运行结果:






4*****************

//第三种插入方法: 在vector中利用别的的vector中的元素插入到iterator指向节点的前面.

//第四种插入方法:  在vector中利用数组中的任意长度的元素插入到iterator指向节点的前面.

vector<int> arr(5, 1);

vector<int> array(2, 400);

vector<int>::iterator it3;

it3 = arr.begin();

arr.insert(it3 + 2, array.begin(), array.end());

int myarray[] = { 200, 300, 300 };

arr.insert(arr.begin(), myarray, myarray + 3);

cout << "插入后的vector当中元素分别为: ";

for (it3 = arr.begin(); it3 < arr.end(); it3++)
{
	cout << *it3 << " ";
}

cout << endl;



运行结果:







容器遍历元素

                                                                                                                                             

遍历元素常用函数:

reference at(int pos):返回pos位置元素的引用

reference front():返回首元素的引用

reference back():返回尾元素的引用

iterator begin():返回向量头指针,指向第一个元素

iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置

reverse_iterator rbegin():反向迭代器,指向最后一个元素

reverse_iterator rend():反向迭代器,指向第一个元素之前的位置


代码演示:


1********************

vector<int> arr(5, 1);

vector<int>::iterator it;
//声明迭代器

//begin() end()同理
it = arr.begin();

cout << "arr的第一个元素为: ";

cout << *it << endl;

//front() back() at() 返回目标位置引用.

int& a1 = arr.front();

int& a2 = arr.back();

int& a3 = arr.at(3);

it = arr.begin();
cout << "原始时的vector当中元素分别为: ";

for (it = arr.begin(); it < arr.end(); it++)
{
	cout << *it << " ";
}

cout << endl;

a1 = 100;

a2 = 200;

a3 = 300;

it = arr.begin();

cout << "修改后的vector当中元素分别为: ";

for (it = arr.begin(); it < arr.end(); it++)
{
	cout << *it << " ";
}

cout << endl;


运行结果;





2********************

vector<int> arr(5);

int i = 0;

vector<int>::reverse_iterator rit = arr.rbegin();

for (; rit != arr.rend(); ++rit)

*rit = ++i;

std::cout << "vector的元素分别为:";

for (vector<int>::iterator it = arr.begin(); it != arr.end(); ++it)

cout << ' ' << *it;

cout << endl;

运行结果:







容器删除元素

                                                                               


iterator erase(iterator it) :删除向量中迭代器指向元素

iterator erase(iterator first, iterator last) : 删除向量中[first, last)中元素

void pop_back() :删除向量中最后一个元素

void clear() : 清空向量中所有元素



代码演示:

1********************

std::vector<int> arr;

for (int i = 1; i <= 10; i++)
{
	arr.push_back(i);
}

cout << "原始时的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
	cout << arr[i] << " ";
}

cout << endl;

//指定的pos位置删除.
arr.erase(arr.begin() + 5);

//指定区间(begin , end)删除.
arr.erase(arr.begin(), arr.begin() + 3);

cout << "删除后的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
	cout << arr[i] << " ";
}

cout << endl;


运行结果:





2********************

std::vector<int> arr;

for (int i = 1; i <= 10; i++)
{
	arr.push_back(i);
}

cout << "原始时的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
	cout << arr[i] << " ";
}

cout << endl;

arr.pop_back();

arr.pop_back();

arr.pop_back();

cout << "删除后的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
	cout << arr[i] << " ";
}

cout << endl;

运行结果:





3********************

std::vector<int> arr;

for (int i = 1; i <= 10; i++)
{
	arr.push_back(i);
}

cout << "原始时的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
	cout << arr[i] << " ";
}

cout << endl;

//放大招了,删除所有元素
arr.clear();

cout << "删除后的vector里面的元素分别是: ";

for (unsigned i = 0; i < arr.size(); ++i)
{
	cout << arr[i] << " ";
}

cout << endl;

运行结果:






总结

                                                                

我们掌握这些知识vector的基本功能,vector还有很多很多的操作,我们一定要能够熟练运用vector.比如它还有这些功能:




还有排序,判空这里我就不一一演示了,我们平时多用vector取代数组,慢慢地你就发现vector越来越好用,加油~

虽然很多公司貌似不是很喜欢STL,不过呢这些东西我相信存在即合理,东西应该是没问题的只要我们会使用,然后

有时间看看底层的源码,相信大家会灵活运用STL.这里的vector以后我可能会自己实现一个简单的vector.





版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Intel Threading Building Blocks

之前说准备写点TBB的内容,就先做个简介吧:TBB,Threading Building Blocks,是Intel推出的针对多线程并行开发的一个library,open source,遵循GPLv2...

Intel Threading Building Blocks 编程指南:简单循环的并行化

可伸缩并行化的最简单的形式就是能够互不干涉地同时运行的迭代的循环。本节将会说明如何将简单的循环并行化。 定义 Intel Threading Building Blocks(Intel TBB) 组件...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

TBB(intel threading building blocks)内存分配算法(一)

开篇:最近研究了一下TBB的内存分配算法,发现设计的非常优雅,故和大家分析一下它的算法思想。 既然是开篇,那么我们就先从最基本的入手来看一下TBB基于Cache对齐的内存管理算法。首先来明确几个概念...

Intel Threading Building Blocks 编程指南:异常与终止

异常与取消 Intel TBB支持异常与终止(cancellation),当算法中的代码抛出一场时,会按顺序发生: 捕获异常。算法内进一步的异常被忽略。算法终止。挂起的迭代操作不被执行。如果内部存在...

Intel Threading Building Blocks 编程指南:原子操作

可以使用原子操作来避免使用互斥。当一个线程执行原子操作,在其他线程眼里,这个操作是瞬时完成的。原子操作的优点是,相比较锁操作是快速的,而且不用为死锁、锁护送等问题而烦恼。缺点是,它们只有有限的一组操作...

STL之二:vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着ve...

STL之二:vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着ve...

c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

本文导语:  Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector...

STL笔记(8)—序列式容器之vector(一)

STL序列式容器简介

STL源码笔记(9)—序列式容器之vector(二)

vector的操作源码,和reverse_iterator简介
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)