c++常见容器操作

总结下常见c++容器操作。

 

1.Vector、 list和 deque

Vector是数组,List 是双端链表,deque时双向队列。分别引入vector/list/deque库。

vector、deque支持随机访问和迭代器偏移,list、deque支持双向访问,list只能自加自减。

push_back、insert

push_front 【vector不可用】

resize 【list不可用】

pop_back、erase

pop_front 【vector不可用】

resize 【list不可用】

下标、迭代器 【list不可用下标】

front、back 【vector不可用front】

 

演示如下:

 

//Vector -- 数组
//List -- 双端链表 多了些自己的merge、split、find操作
//deque --双向队列
void VectorAndListShow()
{
	cout << "=============vector" << endl;
	vector<int> v;

	//push_back-增加
	v.push_back(12);
	v.push_back(13);
	v.push_back(14);
	v.insert(v.begin(), 15);

	//下标方式遍历
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " " << endl;
	}

	//迭代器方式遍历
	for (vector<int>::iterator iter= v.begin(); iter!=v.end(); iter++)
	{
		cout << *iter << " " << endl;
	}

	//erase-删除,注意更新迭代器
	vector<int>::iterator iter = v.begin();
	iter = v.erase(iter);//删除后迭代器返回的是下一个元素,此时要更新迭代器
	cout << "first value after delete:" << *iter <<endl;

	//pop_back-删除
	v.pop_back();

	//reserve/resize-容量
	v.reserve(50);
	cout << "Capacity" << v.capacity() << endl;		//Capacity 总分配空间大小
	cout << "Size" << v.size() << endl;				//size 程序已经占用的空间大小
	v.resize(10);
	cout << "Capacity" << v.capacity() << endl;
	cout << "Size" << v.size() << endl;

	cout << "=============list" << endl;
	list<int> l;

	//push_front/push_back-前增
	l.push_front(10);
	l.push_front(12);
	l.push_front(13);
	l.push_front(14);

	for (list<int>::iterator iter=l.begin(); iter != l.end(); iter++)//只能用!=,不能用<
	{
		cout << *iter << "-";
	}
	cout << endl;

	//front/back-访问首尾
	cout << l.front() << endl;
}

 

 

 

2.stack、 queue、 priority_queue

 

这三种容器都是前面叙述的容器的包装容器,stack、queue默认使用deque实现,priority_queue默认使用vector实现,分别引入stack和queue库。可以更换默认的包装容器。

【a】.stack-后进(push)先出(pop) 

支持push/pop/top/empty

如下,使用list容器来实现stack

 

	//stack-后进(push)先出(pop)
	stack<int, list<int> > s;//注意里面的<>和外面的<>分离
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
	s.push(5);

	while(!s.empty())
	{
		int si = s.top();
		s.pop();
		cout << si << " " << endl;
	}

 

 

 

【b】.queue-先进(push)先出(pop)

支持push/pop/front/top/empty

如下

 

	//queue-先进(push)先出(pop)
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);

	while(!q.empty())
	{
		int si = q.front();//或back
		q.pop();
		cout << si << " " << endl;
	}


【c】.priority_queue-支持优先级的队列,可以自定义优先级

 

支持push/pop/top/empty

如下,实现数字越小则优先级越高,越先输出的队列

 

	priority_queue<int, vector<int>, less<int>>  pq;
	pq.push(18);
	pq.push(22);
	pq.push(31);
	pq.push(48);
	pq.push(52);

	while(!pq.empty())
	{
		int si = pq.top();//不能用front和back
		pq.pop();
		cout << si << " " << endl;
	}

 

 

 

3.map、 set、 multimap 和multiset

 

本质上map和set都是hash实现,可以实现复杂度为O(1)的查找和插入复杂度,分别引入map和set库。

【a】.map和set基本操作

支持 insert/erase/count/find

演示如下:

 

	map<int, string> m;

	//[]下标操作,没有的会新建
	for (int i=0; i<4; i++)
	{
		m[i] = string("12345");
	}

	//直接插入,make_pair需要引入ulity库
	m.insert(make_pair(11, "11"));
	m.insert(make_pair(12, "12"));
	m.insert(make_pair(13, "13"));
	m.insert(make_pair(14, "14"));

	//遍历输出
	for (map<int,string>::iterator iter=m.begin(); iter!=m.end(); iter++)
	{
		cout << iter->first << "->" << iter->second.c_str() << endl;
	}

	//删除
	int nCnt = m.erase(11);//删除键值为11的,返回值为本次删除的元素个数,一定是1
	cout << nCnt << endl;

	map<int,string>::iterator delEnd = m.begin();
	delEnd++;//delEnd不能加,只能自增
	m.erase(m.begin(), delEnd);//只删除,不返回值

	//查找
	int n = m.count(13);//对应值的个数,0或1
	cout << "The count of 13 is:" << n << endl;
	map<int,string>::const_iterator iter = m.find(13);//返回对应元素的迭代器
	cout << iter->first << "find is" << iter->second.c_str() << endl;

	//set 和map类似,用于记录单一数据,快速查询
	set<int> s;
	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(4);

	cout << s.count(5) <<  endl;

 

 

【b】.multimap和multiset
对于multimap和multiset,可存在多个相同的key

相同的key在存储上位置一定是连续的,因此才有如下3种访问指定key元素的方法:

 

	//指定值的全部元素 find+count
	multimap<int,int>::iterator iterFind = mm.find(3);
	for (int i=0; i<mm.count(3); i++, iterFind++)
	{
		cout << iterFind->first << "==>>" << iterFind->second << endl;
	}

	//指定值的全部元素 lower_bound和upper_bound
	multimap<int,int>::iterator iterBegin	= mm.lower_bound(3);
	multimap<int,int>::iterator iterEnd		= mm.upper_bound(3);
	while (iterBegin!=iterEnd)
	{
		cout << iterBegin->first << " ==>> " << iterBegin->second << endl;
		iterBegin++;
	}

	//指定值的全部元素  equal_range
	pair<multimap<int,int>::iterator,multimap<int,int>::iterator> iterPos = mm.equal_range(3);
	while (iterPos.first!=iterPos.second)
	{
		cout << iterPos.first->first << " ==>> " << iterPos.first->second << endl;
		iterPos.first++;
	}

 

 

 

 

 

 

本文完整演示代码下载链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值