C++ STL---vector总结(三):内存管理,排序,存放结构体,swap,shrink to fit

内存管理:

使用reserve()提前设置容量大小

#include <iostream>
#include <vector>
#include <algorithm>//find
using namespace std;

int main(){
/*memory management内存管理
	1.size()			获得容器中元素个数
	2.capacity()		获得容器中总的可以容纳元素的个数,capacity()-size()=还可以容纳多少个元素
	3.void resize (size_type n, value_type val = value_type());
						强制把容器改为容纳n个元素。
						n<capacity():删除尾部的多余元素。
						n>=capacity()并且第二个参数val不为0,则增加n-capacity()个val
	4.reserve(Container::size_type n)
						强制把容器容量改为不小于n,n小于当前容量capacity(),vector忽略它,啥都不做
						如果n大于当前容量,重新申请n,然后赋值回来*/
/*v9.size();v9.capacity()*/
	vector<int> v9;
	for(int i=0;i<15;i++)//size:[15]  capacity:[19](0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)
	{
		v9.push_back(i);
		cout<<"size : "<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	}
/*v9.resize( size_type n, value_type val = value_type())*/
	v9.resize(10);//size:[10]  capacity:[19](0,1,2,3,4,5,6,7,8,9)
	cout<<"after v9.resize(10) the vector size :"<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	v9.resize(20,100);
	cout<<"after v9.resize(20,100) the vector size :"<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	//size:[20]  capacity:[28](0,1,2,3,4,5,6,7,8,9,100,100,100,100,100,100,100,100,100,100)

/*v9.reserve(Container::size_type n)*/
	v9.reserve(100);
	cout<<"after v9.reserve(100) the vector size :"<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	//size:[20]  capacity:[100](0,1,2,3,4,5,6,7,8,9,100,100,100,100,100,100,100,100,100,100)

	vector<int> v10;
	vector<int>::size_type size;
	v10.reserve(1000);
	for(int i=0;i<1000;i++)
		v10.push_back(i);
	cout<<"size : "<<v10.size()<<" capacity: "<<v10.capacity()<<endl;
	system("pause");
	return 0;
}

需要注意的是:

如果push_back不会使得迭代器失效。

但是如果调用insert,erase,会使得数组的插入/删除点后面的所有数据发生变化,那么相应的迭代器也失效。

四、几种重要的算法,使用时需要包含头文件

#include<algorithm>
  • 1

(1)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列 
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1 
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素 

(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

bool Comp(const int& a, const int& b) {
    return a > b;
}

/*排序sort()*/
	sort(v10.begin(),v10.end());//左闭右开,end()的设计是有道理的,刚好这样排序所有的元素

/*翻转reverse()*/
	reverse(v10.begin(),v10.end());//左闭右开

/*复制copy*/
	copy(v9.begin(),v9.end(),v10.begin()+1);//v9左闭右开
/*自定义排序sort()*/
	sort(v9.begin(), v9.end(), Comp);

STL里Vector的assign()函数用法

https://blog.csdn.net/doubleintfloat/article/details/52280481


Vector作为返回值:

用参数引用的方法,直接返回过于麻烦

https://www.cnblogs.com/pengjun-shanghai/p/4913409.html

Vector存结构体---还可以排序

https://www.cnblogs.com/SZxiaochun/p/6377084.html
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>//find,sort,reverse,copy
using namespace std;

struct Person
{
    string Name;
    string Sex;
    int Age;
    int High;
    Person():Age(0),High(0){ }
};

bool Comp(const Person& a, const Person& b) {
    return a.Name > b.Name;//大于号就是从大到小,小于号就是从小到大
}

int main(){
	Person per1,per2;
	per1.Name = "xiaochun";
	per1.Sex = "男";
	per1.Age = 21;
	per1.High = 168;
 
	per2.Name = "chunxiao";
	per2.Sex = "男";
	per2.Age = 22;
	per2.High = 168;
 
	vector<Person> vec_Person;
	vec_Person.push_back(per2);
	vec_Person.push_back(per1);


	sort(vec_Person.begin(),vec_Person.end(),Comp);
	system("pause");
	return 0;
}


Vector--shrink_to_fit

// vector::shrink_to_fit
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (100);
  std::cout << "1. capacity of myvector: " << myvector.capacity() << '\n';

  myvector.resize(10);
  std::cout << "2. capacity of myvector: " << myvector.capacity() << '\n';

  myvector.shrink_to_fit();
  std::cout << "3. capacity of myvector: " << myvector.capacity() << '\n';

  return 0;
}

1. capacity of myvector: 100

2. capacity of myvector: 100//resize不会更改内存大小

3. capacity of myvector: 10//shrink_to_fit更改内存空间大小


Vector--swap

/*swap的用法*/
	vector<int> v11;
	v11.swap(v9);
/*release memory  2种方法---下面2行*/
	//vector<int>().swap(v11);
	v11.swap(vector <int>());



还有好多,慢慢来吧。。。

#include <iostream>
#include <vector>
#include <algorithm>//find,sort,reverse,copy
using namespace std;

bool Comp(const int& a, const int& b) {
    return a > b;
}
int main(){
/*memory management内存管理
	1.size()			获得容器中元素个数
	2.capacity()		获得容器中总的可以容纳元素的个数,capacity()-size()=还可以容纳多少个元素
	3.void resize (size_type n, value_type val = value_type());
						强制把容器改为容纳n个元素。
						n<capacity():删除尾部的多余元素。
						n>=capacity()并且第二个参数val不为0,则增加n-capacity()个val
	4.reserve(Container::size_type n)
						强制把容器容量改为不小于n,n小于当前容量capacity(),vector忽略它,啥都不做
						如果n大于当前容量,重新申请n,然后赋值回来*/
/*v9.size();v9.capacity()*/
	vector<int> v9;
	for(int i=0;i<15;i++)//size:[15]  capacity:[19](0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)
	{
		v9.push_back(i);
		cout<<"size : "<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	}
/*v9.resize( size_type n, value_type val = value_type())*/
	v9.resize(10);//size:[10]  capacity:[19](0,1,2,3,4,5,6,7,8,9)
	cout<<"after v9.resize(10) the vector size :"<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	v9.resize(20,100);
	cout<<"after v9.resize(20,100) the vector size :"<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	//size:[20]  capacity:[28](0,1,2,3,4,5,6,7,8,9,100,100,100,100,100,100,100,100,100,100)

/*v9.reserve(Container::size_type n)*/
	v9.reserve(100);
	cout<<"after v9.reserve(100) the vector size :"<<v9.size()<<" capacity: "<<v9.capacity()<<endl;
	//size:[20]  capacity:[100](0,1,2,3,4,5,6,7,8,9,100,100,100,100,100,100,100,100,100,100)

	vector<int> v10;
	vector<int>::size_type size;
	v10.reserve(1000);
	for(int i=0;i<1000;i++)
		v10.push_back(1000-i);
	cout<<"size : "<<v10.size()<<" capacity: "<<v10.capacity()<<endl;

/*排序sort()*/
	sort(v10.begin(),v10.end());//左闭右开,end()的设计是有道理的,刚好这样排序所有的元素

/*翻转reverse()*/
	reverse(v10.begin(),v10.end());//左闭右开

/*复制copy*/
	copy(v9.begin(),v9.end(),v10.begin()+1);//v9左闭右开
/*自定义排序sort()*/
	sort(v9.begin(), v9.end(), Comp);

/*swap的用法*/
	vector<int> v11;
	v11.swap(v9);
/*release memory  2种方法---下面2行*/
	//vector<int>().swap(v11);
	v11.swap(vector <int>());


	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值