c++修炼之路之STL_map,set

目录

一:序列式容器与键值对 

二:set与multiset 

三:map与multimap 

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

一:序列式容器与键值对 

1.在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list,deque,forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面
存储的是元素本身

2.关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的
键值对,在数据检索时比序列式容器效率更高

3.键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。

4.STL中键值对的定义

template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};

二:set与multiset 

1. set是按照一定次序存储元素的容器
2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行
排序。
4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对
子集进行直接迭代。
5. set在底层是用二叉搜索树(红黑树)实现的。

1.构造相关 

2.迭代器与容量

3.修改与其他操作

4.multiset与set的接口函数一样,但set不允许重复值插入,multiset允许插入,当find时返回第一个重复值的迭代器

5.相关使用

set<int> s1;
s1.insert(1);
s1.insert(6);
s1.insert(3);
s1.insert(19);
s1.insert(11);
set<int>::iterator it1 = s1.begin();
while (it1 != s1.end())
{
	cout << *it1 << " ";
	++it1;
}
cout << endl;

for (const auto& e : s1)
{
	cout << e << " ";
}
cout << endl;

s1.erase(11);
for (const auto& e : s1)
{
	cout << e << " ";
}
cout << endl;

三:map与multimap 

1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元
素。
2. 在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联
的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类
型value_type绑定在一起,为其取别名称为pair:
typedef pair<const key, T> value_type;
3. 在内部,map中的元素总是按照键值key进行比较排序的。
4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序
对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))

1.构造与迭代器

2.修改与访问

 

 注:operator[]的解释

 3.使用

map<string, int> count;
//几种插入方式
count.insert(make_pair("apple",1));
count.insert(pair<string, int>("apple",1));
pair<string, int> p("apple",1);
count.insert(p);

map<string, int>::iterator it1 = count.begin();
while (it1 != count.end())
{
	//cout << (*it1).first << ":" << (*it1).second << " ";
	cout << it1->first << ":" << it1->second << " ";
	++it1;
}
cout << endl;

for (const auto& e : count)
{
	cout << e.first << ":" << e.second << " ";
}
cout << endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值