STL学习笔记-不同容器的操作

本文深入解析C++标准库中的各种容器,包括deque、list、stack、queue、priority_queue、map、multimap、set和multiset的特性与用法,探讨它们在实际编程中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,deque类

deque与vector类似,是一个动态数组,与vector不同的是它可以在数组的开头和结尾插入和删除数据

#include<iostream>
#include<deque>
#include<algorithm>

int main()
{
	std::deque<int> d;
	//队尾插入数据
	d.push_back(3); d.push_back(4); d.push_back(5);
	//队首插入数据
	d.push_front(2); d.push_front(1); d.push_front(0);
	for (int i = 0; i < d.size(); ++i)
	{
		std::cout << "d[" << i << "] = " << d[i] << std::endl;
	}
	d.pop_back();
	d.pop_front();
	std::cout << "after pop:" << std::endl;
	std::deque<int>::iterator it;
	for (it = d.begin(); it != d.end(); ++it)
	{
		int i = distance(d.begin(), it);  // <==> i = (it - d.begin()); distance函数在algorithm中
		std::cout << "d[" << i << "] = " << d[i] << std::endl;
	}
	//system("pause");
	return 0;
}
2,list类

list是双向链表,和数组相比,在任何地方插入元素都非常快,插入时间是固定的,不会随着数据的增多而变长。
//const_iterator不能改变其所指向的元素的值,而iterator可以。

#include<iostream>
#include<list>

void printList(std::list<int> lst)
{
	std::cout << "[ ";
	for (std::list<int>::const_iterator con_it = lst.begin(); con_it != lst.end(); ++con_it)
		std::cout << *con_it << " ";
	std::cout << "]" << std::endl;
}

int main()
{
	std::list<int> lst;
	//插入元素:
	lst.push_back(3); lst.push_back(4); lst.push_back(5);
	lst.push_front(2); lst.push_front(1); lst.push_front(0);
	//操作结果: [0 1 2 3 4 5]
	printList(lst);
	//--------------- insert插入 -------------------
	std::list<int>::iterator it;
	it = lst.begin(); ++it; ++it;
	//在it所指示的位置插入33
	lst.insert(it, 33);           //操作结果: [ 0 1 33 2 3 4 5 ]
	printList(lst);
	//1,在开头插入2个20
	lst.insert(lst.begin(), 2, 20);  //操作结果: [ 20 20 0 1 33 2 3 4 5 ]
	printList(lst);
	//2,在末尾插入10
	lst.insert(lst.end(), 10);  //操作结果: [ 20 20 0 1 33 2 3 4 5 10 ]
	printList(lst);
	std::list<int> lst2;
	lst2.push_back(100); lst2.push_back(200); lst2.push_back(300);
	//3, insert(插入的位置,插入的区间起点,插入的区间终点)
	lst.insert(lst.end(), lst2.begin(), --lst2.end());  //操作结果: [ 20 20 0 1 33 2 3 4 5 10 100 200 ]
	printList(lst);

	//--------------- erase删除 -------------------
	lst.erase(++lst.begin());
	lst.erase(--lst.end());  //操作结果: [ 20 0 1 33 2 3 4 5 10 100 ]
	printList(lst);
	it = lst.begin(); ++it; ++it; ++it;
	lst.erase(lst.begin(), it);  //操作结果: [ 33 2 3 4 5 10 100 ]
	printList(lst);

	//--------------- reverse反转 -------------------
	lst.reverse();  //操作结果: [ 100 10 5 4 3 2 33 ]
	printList(lst);

	//--------------- sort排序 -------------------
	lst.sort();  //操作结果: [2 3 4 5 10 33 100 ]
	printList(lst);
	
	//system("pause");
	return 0;
}
3,satck

stack,(堆)栈,后进先出(LIFO);自适应容器(容器适配器)不是具体的容器;无迭代器,只能在尾部操作数据。主要用在做系统软件开发,如操作系统。
操作:s.empty(); s.size(); s.pop(); s.top(); s.push(item);

#include<iostream>
#include<vector>
#include<list>
#include<stack>

int main()
{
	//可用deque,vector, list做堆栈
	std::stack<int, std::deque<int> > stk;  //<==> 等价于 stack<int> stk; 默认用deque做堆栈
	std::stack<int, std::vector<int> > stk2;
	std::stack<int, std::list<int> > stk3;

	stk.push(1); stk.push(2); stk.push(3); stk.push(4);  //插入元素
	std::cout << "now stack size: " << stk.size() << std::endl;
	while (!stk.empty())  //当栈非空
	{
		int x = stk.top(); //获取栈顶元素
		std::cout << x << " "; //输出栈顶元素
		stk.pop(); //弹出栈顶元素
	}
	//system("pause");
	return 0;
}
4,queue

queue,队列,先进先出(FIFO),容器适配器(自适应容器),可用deque和list做,但不能用vector做。无迭代器,只能在两端操作数据。
操作:q.empty(); q.size(); q.front(); q.back(); q.push(); q.pop();

#include<iostream>
#include<queue>
#include<list>
#include<deque>

int main()
{
	//可用deque,list做队列,不能用vector做
	std::queue<int, std::deque<int> > q;  //<==> 等价于 queue<int> q; 默认用deque做队列
	std::queue<int, std::list<int> > q2;
	
	q.push(1); q.push(2); q.push(3); q.push(4);  //插入元素
	std::cout << "now queue size: " << q.size() << std::endl;
	std::cout << "队首元素:" << q.front() << std::endl;
	std::cout << "队尾元素:" << q.back() << std::endl;
	while (q.size() != 0)
	{
		std::cout << "新队首元素:" << q.front() << std::endl;
		q.pop();
	}
	if (q.empty())
		std::cout << "队列已空!" << std::endl;

	//system("pause");
	return 0;
}
priority_queue

priority_queue,自适应容器,不能使用list;最大、最小优先级队列。
操作:pq.empty(); pq.size(); pq.front(); pq.back(); pq.push(); pq.pop();

#include<iostream>
#include<queue>

int main()
{
	//可用deque,list做队列,不能用vector做
	std::priority_queue<int, std::vector<int> > pq;  //<==> 等价于 priority_queue<int> q; 默认用vector做队列
	std::priority_queue<int, std::vector<int>, std::less<int> > pq_upper; //默认最大值优先级队列,与上面等价;less<int>谓词
	std::priority_queue<int, std::vector<int>, std::greater<int> > pq_low; //最小值优先级队列;greater<int>谓词
	std::priority_queue<int, std::deque<int> > pq2;
	
	pq.push(5); pq.push(10); pq.push(-1); pq.push(20);
	std::cout << "now priority_queue size: " << pq.size() << std::endl;
	while (!pq.empty())
	{
		std::cout << "新队首元素:" << pq.top() << std::endl;
		pq.pop();
	}
	std::cout << "--------最小值优先级队列--------" << std::endl;
	pq_low.push(5); pq_low.push(10); pq_low.push(-1); pq_low.push(20);
	std::cout << "now priority_queue size: " << pq_low.size() << std::endl;
	while (!pq_low.empty())
	{
		std::cout << "新队首元素:" << pq_low.top() << std::endl;
		pq_low.pop();
	}
	//system("pause");
	return 0;
}
5,map和multimap

map和multimap(映射/字典/关联数组),内部结构:红黑树。map中的键不允许重复,若重复,最先插入的键值对有效;multimap中键可以重复。
基本操作:insert; count和find; erase

#include<iostream>
#include<map>
#include<string>

void printMultimap(std::multimap<int, std::string> mmp)
{
	for (std::map<int, std::string>::const_iterator it = mmp.begin(); it != mmp.end(); ++it)
		std::cout << "key: " << it->first << ", value: " << it->second.c_str() << std::endl;
	std::cout << "----------------------------------" << std::endl;
}

int main()
{
	std::map<int, std::string> mp;
	std::multimap<int, std::string> mmp;

	mp.insert(std::map<int, std::string>::value_type(1, "One"));
	mp.insert(std::make_pair(-1, "Minus One"));
	mp.insert(std::pair<int, std::string>(1000, "One-Thousand"));
	mp.insert(std::pair<int, std::string>(1000, "One_Thousand")); //map元素的键(key)不允许重复,重复的不会插入;
	mp[1000000] = "One Million";
	std::cout << "The map size: " << mp.size() << std::endl;
	std::cout << "map 数据:\n";
	for (std::map<int, std::string>::const_iterator it = mp.begin(); it != mp.end(); ++it)
	{
		std::cout << "key: " << it->first << ", value: " << it->second.c_str() << std::endl;
	}
	std::cout << "map简单查找mp[1000] = " << mp[1000] << std::endl;
	std::cout << "----------multimap------------" << std::endl;

	mmp.insert(std::multimap<int, std::string>::value_type(1, "One"));
	mmp.insert(std::multimap<int, std::string>::value_type(10, "Ten"));
	mmp.insert(std::multimap<int, std::string>::value_type(10, "Ten"));
	mmp.insert(std::make_pair(-1, "Minus One"));
	mmp.insert(std::pair<int, std::string>(1000, "One Thousand"));
	mmp.insert(std::pair<int, std::string>(1000, "One Thousand"));
	mmp.insert(std::pair<int, std::string>(1000, "One_Thousand"));
	mmp.insert(std::pair<int, std::string>(1000, "One-Thousand"));
	//mmp[1000000] = "One Million";  multimap不能用这种方式插入元素
	std::cout << "The multimap size: " << mmp.size() << std::endl;  //内部结构红黑树,查找非常快。
	std::cout << "multimap 数据:\n";
	printMultimap(mmp);

	std::cout << "multimap中有" << mmp.count(1000) << "个1000:" << std::endl;  //count计数

	std::multimap<int, std::string>::const_iterator cit;  //find查找
	cit = mmp.find(1000);
	for (int i = 0; i < mmp.count(1000); ++i)
	{
		std::cout << "  " << cit->first << " : " << cit->second << std::endl;
		cit++;
	}

	if (mmp.erase(-1) > 0)  //erase删除,若删除成功,返回结果大于0;
		std::cout << "删除-1后剩余元素:" << std::endl;
	printMultimap(mmp);

	if (mmp.find(10) != mmp.end())
	{
		mmp.erase(10);  //不管对应的键值对有多少个,直接全部删除
		std::cout << "删除10后剩余元素:" << std::endl;
	}
	printMultimap(mmp);

	mmp.erase(mmp.lower_bound(1000), mmp.upper_bound(1000));
	std::cout << "删除1000后剩余元素:" << std::endl;
	printMultimap(mmp);

	//system("pause");
	return 0;
}

6,set和multiset

set和multiset,set中的元素不允许重复,而multiset可以。数据结构,红黑树;插入(稍慢),查找和删除的速度都非常快。若有大量的数据,建议优先放set中,放入其中的数据会自动进行排序,且其中的元素不能修改,可先删除在插入来实现修改。
基本操作:insert; count和find; erase

#include<iostream>
#include<set>

template <typename Container>
void printSet(const Container& mset)
{
	for (Container::const_iterator con_it = mset.begin(); con_it != mset.end(); ++con_it)
		std::cout << *con_it << " ";
	std::cout << "\n------------------------------" << std::endl;
}

int main()
{
	std::set<int> st;
	std::multiset<int> mst;
	st.insert(1); st.insert(-1); st.insert(10); st.insert(10); st.insert(27); //重复元素自动过滤掉
	if (st.find(27) != st.end())  //find方法
		std::cout << "27在本set中。\n";

	std::cout << "set中的元素:";
	printSet(st);
	

	mst.insert(st.begin(), st.end());
	mst.insert(100); mst.insert(100); mst.insert(100);
	std::cout << "multiset中有 " << mst.count(100) << "个100" << std::endl;
	std::cout << "multiset中的有" << mst.size() << "个元素:";
	printSet(mst);

	mst.erase(100); //删除元素,不管有多少个100全部删除。
	std::cout << "删除100后剩余元素:";
	printSet(mst);

	mst.clear(); //清空所有元素
		std::cout << "clear后的元素个数:" << mst.size() << std::endl;

	//system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值