简析vector

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zhang_1218/article/details/78867177

简析vector

原文见:www.louhang.xin

1. 简介

vector是C++标准模板库中的内容,简单说,它是一个能够存放各种类型的动态顺序表,其亦是一个包含数据结构与算法的模板类和函数库。

以下是API中的定义:

Vectors are a kind of sequence container. As such, their elements are ordered following a strict linear sequence.

这句话翻译过来的意思就是:vector是一种序列容器。 因此,它们的元素是按照严格的线性顺序排序的。

之前我用C语言简单实现了类似于vector的顺序表,与之相比,唯一的不同就是vector是一个序列容器。为何呢?

这是因为C++之中对其进行了扩展及模板套用,使其内亦包含了迭代器,因此认为vector是一个容器,它能够存放各种类型的对象。所以相对来说vector比普通的顺序表对外的接口变多了,应用起来更加方便,但是同时也变得更加复杂了。

2.应用

当需要应用vector时,注意需要引入头文件进行包含:

#include<vector>

同时,vector属于std命名空间,因此运用是需要进行命名限定,以下即为限定方式:

std::vector<Type>  test;  //应用命名
using namespace std;      //全局命名

上面已经说过,vector就类似于一个动态增容的顺序表,那么来看看其内部包含的接口:

image.png

下面来看看vector简单的实现:

#include<vector>
#include<iostream>
using namespace std;

void Print(vector<int>& l)
{
        //迭代器
	vector<int>::iterator it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

void vectorTest()
{
	vector<int> seqlist;
	seqlist.push_back(1);
	seqlist.push_back(2);
	seqlist.push_back(3);
	seqlist.push_back(4);
	seqlist.push_back(5);
	seqlist.push_back(6);
	Print(seqlist);
}

简单解析一下vector内的函数:

push_back:尾部插入一个数据

pop_back:弹出尾部的最后一个数据

insert:插入数据,支持指定位置插入数据以及指定位段插入数据段

erase:删除数据,支持指定位置删除数据,指定数据段的删除

clear:清除vector内的数据内容

empty:判断vector内是否含有数据

size:返回当前vector中实际存储的数据个数

capacity:返回vector可存放数据的容量

resize:更新vector的内存容量以及实际数据容量

reserve:更新vector的内存容量

front:返回vector首部即第一个数据

back:返回vecto尾部即最后一个数据,不检查这个数据是否存在。

swap:将两个不同vector容器内部的数据进行交换

以下是迭代器部分:

begin:返回vector第一个数据的迭代器

end:返回vector最后一个数据的的下一个位置的迭代器

rbegin:返回vector逆向排序的最后一个数据的下一个位置的迭代器

rend:返回vector逆向排序的第一个数据的迭代器

常用的接口即是上面的部分,需要注意的则是迭代器以及resize与reserve。

具体的应用可以见下面我的一个测试用例:

#include<iostream>
#include<vector>
using namespace std;

void Print(vector<int>& l)
{
	// 正向迭代器部分测试
	vector<int>::iterator it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

void vectorTest()
{
	vector<int> seqlist;
	// push_back() 测试
	cout << "pushback测试: " << endl;
	seqlist.push_back(1);
	seqlist.push_back(2);
	seqlist.push_back(3);
	seqlist.push_back(4);
	seqlist.push_back(5);
	seqlist.push_back(6);
	Print(seqlist);

	// pop_back 测试
	cout << "pop_back 测试" << endl;
	seqlist.pop_back();
	Print(seqlist);

	// reserve() 测试
	cout << "reserve() 测试" << endl;
	seqlist.reserve(8);
	Print(seqlist);
	
	// resize() 测试
	cout << "resize() 测试" << endl;
	seqlist.resize(10);
	Print(seqlist);

	// capacity() 测试
	cout << "capacity-> " << seqlist.capacity() << endl;

	// size() 测试
	cout << "size-> " << seqlist.size() << endl;

	//反向迭代器部分测试
	cout << "反向迭代器部分测试" << endl;
	vector<int>::reverse_iterator vit = seqlist.rbegin();
	while (vit != seqlist.rend())
	{
		cout << *vit << " ";
		vit++;
	}
	cout << endl;
}

上面的测试用例只是简单的实现了几个接口的作用。更多的还未实现。


结语:

书写此篇博客,一来是巩固我的所学,再者我希望这个文档可以帮助所读的小伙伴们,能够让你熟悉掌握并使用STL vector容器。


猜你喜欢

转载自blog.csdn.net/Zhang_1218/article/details/78867177