C++中Vector的使用总结

本文详细介绍了C++ STL中Vector容器的基本操作,包括初始化、遍历、排序、查找、增删等常用方法,并探讨了其内存管理机制。
//vector

//vector的遍历方式有两种:
1 for(int i = 0;i < a.size();++i)
2 for(iter = ivector.begin();iter != ivector.end();iter++)
3 for_each

//例程:
#include <vector>
#include <iostream>

void print(int n)
{
	cout<<n<<endl;
}

int main()
{
	int a[7] = {1,2,3,4,5,6,7};
	vector<int> ivector(a,a+7);//用数组初始化vector,ivector(数组首元素地址,数组尾元素后一个地址)
	vector<int>::iterator iter;//定义迭代器
	for(iter = ivector.begin();iter != ivector.end();iter++)//输出容器内每一个元素的值
		cout<<*iter<<endl;
		
	ivector[5] = 1;//单个元素赋值类似数组
	cout<<ivector[5]<<endl<<ivector.size()<<endl;
	
	for(int i = 0;i < 5;i++)
		cout<<ivector[i]<<endl;//也可以像数组一样输出
	
	for_each(ivector.begin(),ivector.end(),print);//for_each方式输出

	return 0;
}

//vector中存放结构体时的排序,通过重载运算符的方式

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

typedef struct rect
{
	int id;
	int length;
	int width;
	bool operator< (const rect &a) const
	{
		if(id! = a.id)
			return id<a.id;
		else
		{
			if(length != a.length)
				return length<a.length;
			else
				return width<a.width;
		}
	}
}Rect;

int main()
{
	vector<Rect> vec;
	Rect rect;
	rect.id = 2;
	rect.length = 3;
	rect.width = 4;
	
	vec.push_back(rect);
	
	rect.id = 1;
	rect.length = 3;
	rect.width = 4;
	
	vec.pushback(rect);
	
	vector<Rect>::iterator it = vec.begin();
	sort(vec.begin(),vec.end());//sort()内部默认用<进行升序排序
	cout<<(*it).id << ' '<<(*it).length<< ' '<<(*it).width<<endl;
	
	return 0;
}


//通过在结构体外定义函数来进行比较
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

typedef struct rect
{
	int id;
	int length;
	int width;
}Rect;

int cmp(Rect a,Rect b)
{
	if(a.id != b.id)
		return a.id < b.id;
	else
	{
		if(a.length != b.length)
			return a.length < b.length;
		else
			return a.width < b.width;
	}
}

int main()
{
	vector<Rect> vec;
	Rect rect;
	rect.id = 2;
	rect.length = 3;
	rect.width = 4;
	
	vec.push_back(rect);
	
	rect.id = 1;
	rect.length = 3;
	rect.width = 4;
	
	vec.pushback(rect);
	
	vector<Rect>::iterator it = vec.begin();
	sort(vec.begin(),vec.end(),cmp);
	cout<<(*it).id << ' '<<(*it).length<< ' '<<(*it).width<<endl;
	
	return 0;
}

//vector的查找
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	
	vector<int>::iterator iter = find(vec.begin(),vec.end(),3);//从第一个元素开始查找元素3
	if(iter == vec.end())
		cout<<"Not Found!";
	else
		cout<<"Found!";
	return 0;
}

//vector的删除
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	
	vector<int>::iterator iter = vec.begin();
	for(;iter != vec.end();)
	{
		if(*iter == 3)
			iter = vec.erase(iter);//删除元素后,返回下一个元素的指针,因此要判断它是否到达底部
		else
			++iter;
	}
	
	for(iter = vec.begin();iter != vec.end();iter++)
		cout<<*iter<<" ";
	
	return 0;
}

vec.erase(vec.begin()+i,vec.end()+j);//删除第i+1到j个之间的元素(地址区间[i,j-1])
vec.pop_back();//删除最后一个元素

//vector的增加,三种函数原型
iterator insert(iterator loc,const TYPE &val);
	//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器

void insert(iterator loc,size_type num,const TYPE &val);
	//在指定位置loc前插入num个值为val的元素

void insert(iterator loc,input_iterator start,input_iterator end);
	//在指定位置loc前插入区间[start,end)的所有元素
	
//vector的查增删用法综合举例

#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
void print(vector<int> v)
{
	vector<int>::iterator iter=v.begin();
	for(;iter != v.end();iter++)
		cout<<*iter<<" ";
	cout<<endl;
}

int main()
{
	vector<int> v;						//vector内有0元素
	int values[] = {1,3,5,7};
	
	v.insert(v.end(),values+1,values+3);//vector内元素:3,5
	printf(v);
	
	v.push_back(9);						//vector内元素:3,5,9
	printf(v);
	
	v.erase(v.begin()+1);				//vector内元素:3,9
	printf(v);
	
	v.insert(v.begin()+1,4);			//vector内元素:3,4,9
	printf(v);
	
	v.insert(v.end()-1,4,6);			//vector内元素:3,4,6,6,6,6,9
	printf(v);
	
	v.erase(v.begin()+1,v,begin()+3);	//vector内元素:3,6,6,6,9
	printf(v);
	
	v.pop_back();						//vector内元素:3,6,6,6
	printf(v);							
	
	v.clear();							//清空vector内元素,vector内有0元素
	printf(v);
	
	if(true == v.empty())				//判断vector是否为空
		cout<<"null"<<endl; 
	return 0;
}


/*vectord的内存管理
1 reserve()函数提前设定容量大小
2 size()函数获得容器中有多少元素
3 capacity()函数获得容器在当前已分配的内存中共可容纳多少元素
若要获知容器中还剩多少空间,则用capacity() - size()
4 resize(Container::size_type n)强制把容器改为容纳n个元素
	调用该函数后,size()会返回一个n
		如果n小于当前大小,则容器尾部的元素会被销毁。
		如果n大于当前大小,则新默认构造函数会添加到容器尾部。
		如果n大于当前容量,在元素加入之前会重新分配。
		
5 reserve(Container::size_type n)强制容器把他的容量改为不小于n,n不小于当前所需大小
	如果n小于当前容量,则vector会忽略它
	
总结:只要有元素需要插入但是容器容量不足的时候就会发生重新分配(包括他们维护的原始内存分配和回收,对象的拷贝和析构,迭代器、指针和引用的失效),这样会导致效率低下,因此最好在容器被构造之后,用reserve()尽快快容器的容量设置为足够大。
*/
		参考《后台开发——核心技术与应用实践》参考《后台开发——核心技术与应用实践》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值