vector的相关概念及常用接口

vector的基本概念

功能:

vector容器与数组非常类似,也称单端数组(动态数组)

vector容器的内部结构图示

vector的相关概念及常用接口_第1张图片

vector与普通数组之间的区别:

vector可以动态扩展,而普通数组是静态空间,一旦确定了大小就不能修改

动态扩展:

动态扩展并非是在原有空间接新空间(因为不知道后面空间的使用情况),而是找更大的内存空间,然后将原数据拷贝到新空间中,释放原空间

vector容器的迭代器是支持随机访问的迭代器(即可以进行+2,+n的操作)

vector构造函数

功能:对vector容器进行初始化操作

vector的相关概念及常用接口_第2张图片

eg:

vector的相关概念及常用接口_第3张图片

注:1、用vector时需包含头文件vector

2、常用的构造函数有无参构造和拷贝构造

vector赋值操作

功能:为vector容器赋值

vector的相关概念及常用接口_第4张图片

eg:vector的相关概念及常用接口_第5张图片

vector容量和大小操作

总结:判断容器是否为空用成员函数empty,返回元素个数用size,返回容器容量用capacity,重新指定大小用resize。(注:容器容量永远大于等于容器元素个数)

vector的相关概念及常用接口_第6张图片

eg:

#include
using namespace std;
#include
void printVector(const vector&v)//打印动态数组中的元素
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
int main()
{
	vectorv;//默认构造,又称无参构造
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);//将i插入到动态数组中
	}
	if (v.empty())//若容器v为空,则返回true,否则返回false
	{
		cout << "容器vector为空" << endl;
	}
	else
	{
		cout << "vector容器不为空" << endl;
		printVector(v);//打印v中的元素
		cout << "容器v的大小为:" << v.size() << endl;
		cout << "容器v的容量为:" << v.capacity() << endl;
	}
	//v.resize(10);//若容器变长,则变长的位置默认填0
	//printVector(v);
	v.resize(10, 100);//可用resize的重载版本将变长位置的值改成其他的值
	printVector(v);
	cout << "容器v的容量为:" << v.capacity() << endl;
	v.resize(3);//若容器变短,则末尾超出容器长度的元素被删除
	printVector(v);
	system("pause");
	return 0;
}

测试结果: 

vector的相关概念及常用接口_第7张图片

vector的插入与删除

各插入与删除操作与成员函数对应关系如下:

尾插--pop_back 、尾删--push_back、插入--insert(位置迭代器)、删除--erase(位置迭代器)、清空---clear

vector的相关概念及常用接口_第8张图片

#include
using namespace std;
#include
void printVector(const vector&v)//打印动态数组中的元素
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
int main()
{
	vectorv;//默认构造,又称无参构造
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);//尾插法
	}
	printVector(v);//打印数组中的元素
	v.pop_back();//尾删法--删除最后一个元素
	printVector(v);
	v.insert(v.begin()+2, 100);//将迭代器指针往起始位置向后偏移2个单位,并将100插入到此位置中
	printVector(v);
	v.insert(v.begin(), 2, 100);//insert的重载版本--将2个100插入到容器v的起始位置中
	printVector(v);
	v.erase(v.begin() + 4);//删除从起始位置向后偏移4个单位的元素
	printVector(v);
	v.erase(v.begin(), v.begin() + 2);//删除[v.begin(),v.begin()+2]之间的所有元素
	printVector(v);
	v.clear();//清空数组中所有元素
	printVector(v);
	system("pause");
	return 0;
}

vector数据存取

可以通过下标、成员函数at,front,back来访问vector中的元素

vector的相关概念及常用接口_第9张图片

vector互换容器

用内置成员函数swap来实现两个vector容器的交换

实际应用:swap可以使两个容器互换,达到实用的收缩内存效果

eg:

#include
using namespace std;
#include
int main()
{
	vectorv;
	for (int i = 0; i < 10000000; i++)//首先用尾插法将v的空间扩的非常大
	{
		v.push_back(i);//尾插法
	}
	cout << "容器的大小为:" << v.size() << endl;//结果为10000000
	cout << "容器的容量为:" << v.capacity() << endl;//11958657
	//现在resize将容器的大小变为3
	v.resize(3);
	cout << "容器的大小为:" << v.size() << endl;//结果为3
	cout << "容器的容量为:" << v.capacity() << endl;//11958657
	//可以发现容器的大小变为了3,但容器容量还为11958657,造成了大量的空间浪费,因此需用容器交换来解决
	vector(v).swap(v);
	//vector(v)表示创建了一个匿名对象,并用拷贝构造的方式将v的数据传给了此匿对象(设为x)。
	//vector(v).swap(v)---将v与x进行交换,使得v指向x所指向的空间,x指向v所指向的空间。而匿名对象的特点就是执行完本行后,
	//所占空间会立即被回收。从而达到了收缩内存的效果
	cout << "容器的大小为:" << v.size() << endl;//结果为3
	cout << "容器的容量为:" << v.capacity() << endl;//输出结果同样为3
	system("pause");
	return 0;
}

vector预留空间

作用:若一开始就知道要插入很多的数,为了减少动态开辟的次数,可以在一开始就利用reserve预留空间。

eg:

#include
using namespace std;
#include
void printVector(const vector&v)//打印动态数组中的元素
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
int main()
{
	vectorv;
	int count = 0;//用以统计数组动态增长的次数
	int*p=NULL;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			count++;
		}
	}
	cout << count << endl;//结果为30,说明动态增加到100000个数,需要动态开辟30次空间
	//若要减少动态开辟的次数,则可提前给v预留100000个空间,即
	vectorv1;
	v1.reserve(100000);
	count = 0;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
		if (p != &v1[0])
		{
			p = &v1[0];
			count++;
		}
	}
	cout << count << endl;//输出结果为1,大大减少了动态开辟内存造成的开销
	system("pause");
	return 0;
}

你可能感兴趣的:(c++,开发语言)