STL容器

总体

按照不同的需要,容器可以分为三类:
序列式容器,关联式容器,无序容器
在这里插入图片描述

序列式容器

vector和deque虽然可以随机访问,但不能通过[ ]进行赋值,list无法使用[ ],只能通过front()或者迭代器访问元素。list和deque都可以双向访问,故多了push_front()

#include<vector>
#include<deque>
#include<array>
#include<list>
#include<forward_list>

vector<int> m_vector;
	m_vector.push_back(10);
	//m_vector[1] = 20;//error
	cout << m_vector[0] << endl;

	deque<int> m_deque;
	m_deque.push_back(5);
	//m_deque[1] = 12;//error
	m_deque.push_front(10);
	cout << m_deque[0]<<" "<<m_deque[1]  << endl;

	array<int, 5> m_array;
	m_array[0] = 1;
	cout << m_array[0] << endl;

	list<int> m_list;
	m_list.push_back(10);
	m_list.push_front(5);
	cout << m_list.front() << endl;

关联式容器

关联式容器由二叉树实现,左子树所有元素都比自己小,右子树所有元素都比自己大。

插入元素后,会自动进行排序


#include<set>
#include<map>
#include<string>

map<int, string> m_map = { {1,"1"},{2,"2"} };
		for (const auto& elem : m_map)
			cout << elem.second << " " << endl;;


set<double > m_set = {1,2,3,4,5};
	for (const auto& elem : m_set)
		cout << elem <<" ";
	cout << endl;
	m_set.insert({ 1.5,2.5,3.5,4.5,5.5 });//out: 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5

set 当再次插入相同的元素,将失败

m_set.insert({ 1.5,2.5,3.5,4.5,5.5 });//out: 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5
	for (const auto& elem : m_set)
		cout << elem << " ";

multiset和multimap插入元素,后将新元素排在等效元素的后面,且调用insert,emplace或者erase等等效元素的次序也保持不变

multiset<double> multiset = { 1,2,3,4,5 };//out: 1 1.5 1.5 2 2.5 2.5 3 3.5 3.5 4 4.5 4.5 5 5.5 5.5

但当尝试修改value的值,会报错,修改value将会改变容器的有序状态,所以set在底层为const double,而map在底层为pair<const int,string>

	for (auto& elem : m_set)
		elem = 0;//error

无序容器

无序容器由hash table实现,内部结构是一个由list组成的array,通过哈希函数的运算确定元素落在这个array的位置。
元素没有明确的次序,当安插一个元素时候,所有元素的顺序都可能改变,c++标准保证删除不会改变次序,但删除后的插入将会重新排序。

#include<unordered_set>
#include<unordered_map>
unordered_set<double> m_unordered_set;
	unordered_map<int, string> m_unordered_map;

	m_unordered_set.insert({ 1,2,3,4,5,6 });
	for (const auto& elem : m_unordered_set)
		cout << elem << " ";//out:1 6 4 3 2 5
	cout << endl;

	m_unordered_set.insert( 7 );
	for (const auto& elem : m_unordered_set)
		cout << elem << " ";//out:1 6 4 3 2 7 5
	cout << endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工农村贴膜小哥

我倒是要看看是那个憨憨在给我打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值