C++STL03---Vector容器

1.动态数组,可变数组,是一个连续的内存空间

2.vector容器,称为单口容器

3.实现动态增长:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原来空间数据拷贝到新空间,释放旧空间的数据,在把新元素插入新申请的空间里。

问:reserve和resize的区别?

答:reserve是容器预留的空间,但在空间内不是真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。

resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了。因此可以巧用reserve增加程序效率。

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

void printVector(vector<int> &v)
{
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)
	{
		cout << *iter << "  ";
	}
	cout << endl;
}

//初始化
void test01()
{
	vector<int> v;		//默认构造

	int arr[] = { 10,20,30,40 };
	vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
	vector<int> v3(v2.begin(), v2.end());
	vector<int> v4(v3);

	printVector(v4); 
	printVector(v3);
	printVector(v2);
}

//vector常用复制操作
void test02()
{
	int arr[] = { 10,20,30,40 };
	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));

	//成员方法
	vector<int> v2;
	v2.assign(v1.begin(), v1.end());

	//重载=
	vector<int> v3;
	v3 = v2;

	int arr2[] = { 101,202,303,404 };
	vector<int> v4(arr2, arr2 + sizeof(arr2) / sizeof(int));
	v4.swap(v1);

	printVector(v1);
	printVector(v2);
	printVector(v3);
	printVector(v4);
}

//大小操作
void test03()
{
	int arr2[] = { 101,202,303,404 };
	vector<int> v4(arr2, arr2 + sizeof(arr2) / sizeof(int));

	cout << "size: " << v4.size() << endl;
	if (v4.empty())
	{
		cout << "空";
	}
	else
		cout << "不空" << endl;
	
	v4.resize(2);   //大小变小了之后会删除后面的元素
	printVector(v4);

	v4.resize(12);   //大小变大了之后会有默认值
	printVector(v4);

	v4.resize(12,1);   //大小变大了之后自定义值
	printVector(v4);
	for (int i = 0; i < 10000; i++)
	{
		v4.push_back(i);
	}

	cout << "size : " << v4.size() << endl;							//元素的个数
	cout << "容量 : "    << v4.capacity() << endl;					//容量
}

//存取数据
void test04()
{
	int arr2[] = { 101,202,303,404 };
	vector<int> v4(arr2, arr2 + sizeof(arr2) / sizeof(int));

	for (int i = 0; i < v4.size(); i++)
	{
		cout << v4[i] << "  ";
	}
	cout << endl;

	for (int i = 0; i < v4.size(); i++)
	{
		cout << v4.at(i) << "  ";
	}
	cout << endl;

	//区别: at抛异常, []不会抛异常


	cout << "front: " << v4.front() << endl;		//第一个元素
	cout << "back: " << v4.back() << endl;

}

//插入删除
void test05()
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	//头部插入
	v.insert(v.begin(), 30);
	//尾部插入
	v.insert(v.end(), 40);

	v.insert(v.begin() + 2, 100);    //vector支持随机访问

	//支持数组下标,一般支持随机访问
	//迭代器也可以直接+2  +3   -2  -5 随机访问
	printVector(v);

	//删除
	v.erase(v.begin());
	printVector(v);
	v.erase(v.begin()+1,v.end());
	printVector(v);

	v.clear();			//清空所有
	cout << "sze :" << v.size() << endl;
}

void test06()
{
	//vector里面增加元素会自动增长,但是删掉元素后不会自动缩减
	//但是我们可以用swap收缩空间

	vector<int> v;
	for (int i = 0; i < 10000; i++)
		v.push_back(i);

	cout << "size: " << v.size() << endl;
	cout << "capacity: " << v.capacity() << endl;

	v.resize(10);
	cout << "=====================" << endl;
	cout << "size: " << v.size() << endl;
	cout << "capacity: " << v.capacity() << endl;

	//收缩空间
	vector<int>(v).swap(v);			//这里是匿名对象,匿名空间用完直接销毁了
	cout << "=====================" << endl;
	cout << "size: " << v.size() << endl;
	cout << "capacity: " << v.capacity() << endl;
}

void  test07()
{
	//reserve和resize的区别
	//reserve 预留空间  
	//resize	

	int num = 0;
	int* address = NULL;

	vector<int> v;
	v.reserve(1000);
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (address != &(v[0]))			//观察拷贝的过程
		{
			address = &(v[0]);
			num++;
		}
	}

	cout << "num : " << num << endl;

	//如果你先知道容器大概要存储的元素个数,那么你可以用reserve预留空间,
	//这样就少了拷贝的过程
	
}

int main()
{
	//test01();
	test07();

	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值