vector

在这里插入图片描述
尽量不要用insert在头部进行插入操作,因为要移动大量元素。

动态增长原理
插入新元素时,如果原来的空间不够,那么vector会重新申请一个更大的空间,将原来的数据拷贝过来,将原来的空间释放掉,把新元素插入到重新申请的空间。

vector构造函数
在这里插入图片描述

void printvector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}
void printvector1(int v)
{
	cout<<v<<"  ";
}
void test01()
{
	vector<int> v1;//默认构造
	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);
	/*for (vector<int>::iterator it =v4.begin(); it != v4.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
	*/
	/*printvector(v1);
	printvector(v2);
	printvector(v3);
	printvector(v4);*/
	vector<int>::iterator pbegin = v4.begin();//指向第一个元素
	vector<int>::iterator pend = v4.end(); 
	for_each(pbegin, pend, printvector1);
}

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 arr1[] = { 100,200,300,400 };
	vector<int> v4(arr1, arr1 + sizeof(arr) / sizeof(int));//默认构造
	printvector(v1);
	printvector(v2);
	printvector(v3);
	printvector(v4);
	cout << "---------------------------" << endl;
	v4.swap(v1);//交换v1 v4的内容,交换的是指向内容的指针
	printvector(v1);
	printvector(v2);
	printvector(v3);
	printvector(v4);

}

vector大小操作
在这里插入图片描述
resize 若容器变长,则以默认值填充新位置,如果容器变长,则末尾超出容器长度的元素被删除。

void test3()
{
	int arr1[] = { 100,200,300,400 };
	vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int)); 
	cout << "size:" << v4.size() << endl;
	if (v4.empty())//if (v4.empty()==true)
		cout << "空" << endl;
	else {
		cout << "不空" << endl;
	}
	v4.resize(2);//100  200 
	printvector(v4);
	v4.resize(6);//100 200 0 0 0 0 默认添0
	printvector(v4);
	v4.resize(8,1);//默认添1
	printvector(v4);//100 200 0 0 0 0 1 1

	for (int i = 0; i < 1000; i++)

	{
		v4.push_back(i);
	}//先多申请点空间  不够再申请
	cout << "v4.size:" << v4.size() << endl;//元素个数1008
	cout << "v4.capacity()" << v4.capacity() << endl;//容量1066
}

vector数据存取操作
在这里插入图片描述

//存取操作
void test4()
{
	int arr1[] = { 100,200,300,400 };
	vector<int> v4(arr1, arr1 + sizeof(arr1) / 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;
}

vector插入和删除操作

void test5()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	//头插法
	v.insert(v.begin(), 30);
	v.insert(v.end(), 40);
	printvector(v);//30 10 20 40
	v.insert(v.begin() + 2, 50);//能+2是因为vector支持随机访问,否则只能+1
	//支持中括号[]下标访问的都支持随机访问
	printvector(v);
	//删除
	v.erase(v.begin());
	printvector(v);
	v.erase(v.begin() + 1,v.end());//删掉从第二个位置到最后
	printvector(v);
	v.clear();
	cout << "size" <<v. size() << endl;

}

收缩空间

//巧用swap左键空间
void test6()
{
	//vector 添加元素 他会自动增长,删除元素时,不会自动减少
	vector<int> v;
	for (int i = 0; i < 1000; i++)
	{
		v.push_back(i);

	}
	cout << "size" << v.size() << endl;//1000
	cout << "capacity" << v.capacity() << endl;//1066
	v.resize(10);
	cout << "size" << v.size() << endl;//10
	cout << "capacity" << v.capacity() << endl;//1066

	//容量并没有减少 对于此时 应该收缩容量
	//收缩空间
	vector<int>(v).swap(v);//vector<int>(v)  用v初始化匿名对象
	                        //初始化完成之后进行交换,指针指向发生交换
	cout << "size" << v.size() << endl;//10
	cout << "capacity" << v.capacity() << endl;//1066

}

reserve和resize的区别?
reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素
resize()是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了

void test7()
{
	//reverse 预留空间
	int num = 0;
	int *address = NULL;
	vector<int> v;
	v.reserve(1000);
	for (int i = 0; i < 1000; i++)
	{
		v.push_back(i);
		if (address != &(v[0]))//v[0]数据首地址
		{
			address = &(v[0]);
			num++;
		}
	}//如果你知道元素大概要存储的元素个数,那么你可以用reserve预留空间
	cout << "num" << num << endl;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值