1.理解键值对
2.map 的使用
3.multimap 的使用
4.底层结构
键值对是用来表示一对一的数据映射关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表关键字,value代表与key对应的信息值。
我们生活中有许多这样的对应关系,例如英汉互译字典就是典型的
//键值对
template
struct pair
{
typedef K first_type;
typedef V second_type;
K first;
V second;
pair()
:first(K())
, second(V())
{}
pair(const K& a, const V&b)
: first(a)
, second(b)
{}
}
//make_pair 是函数模板,根据pair的类型直接推出参数类型
template
pair make_pair(const K&k, const V&v)
{
return pair(k, v);
}
想要深入了解的可以查看:map文档
下面我简单介绍 一下map:
map提供一对一的数据处理能力(其中第一个是关键字,第二个是该关键字对应的值),由于这个特性(键值对),我们在描述英汉互译词典时就变得很轻松了。下面是使用map描述字典的示例
//map 的使用--英汉互译字典
void test_map()
{
map<string, string> m1;
map<string, string>m2{ { "apple", "苹果" },
{ "banan", "香蕉" }, { "orange", "橘子" } };
cout << m2["apple"] << endl; //苹果
cout << m2["peach"] << endl; //空串
//迭代器使用
map<string, string>::iterator it = m2.begin();
//auto it=m2.begin();
while (it != m2.end())
{
cout << (*it).first << ":" << (*it).second << " ";
it++;
}
cout << endl;
}
operator[]的原理是:
用构造一个键值对,然后调用insert()函数将该键值对插入到map中
如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器
如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器
operator[]函数后 将insert返回值键值对中的value返回
注意: 在元素访问时,有一个与operator[]类似的操作at()函数(该函数不常用),都是通过key找到与key 对应的value然后返回其引用,不同的是:当key不存在时,operator[]用默认的value与key构造键值对然后插入后返回该默认value,at()函数直接抛异常。
void TestMap() {
map<string, string> m; // 构造一个空的map,此时m中一个元素都没有
m ["apple"] = "苹果";
cout << m["apple"] << endl; //返回value值
cout << m["banan"] << endl; //插入key
cout << m.size() << endl;
m.at("peach"); //直接抛出错误
}
void TestMap2()
{
map<string, string> m;
//用不同的方法再map中插入元素
m.insert(pair<string, string>("peach", "桃子")); //用pair直接来构造键值对
m.insert(make_pair("banan", "香蕉")); //用make_pair函数来构造键值对
m["apple"] = "苹果"; // 借用operator[]向map中插入元素
m.insert(m.find("banan"), make_pair("waterme", "水蜜桃")); //iterator的insert中的position 只是参考位置
cout << m.size() << endl;
// 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列
for (const auto& e : m)
cout << e.first << ":" << e.second << endl;
cout << endl;
// map中的键值对key一定是唯一的,如果key存在将插入失败
auto ret = m.insert(make_pair("peach", "桃色"));
if (ret.second)
cout << "不在map中, 刚插入" << endl;
else
cout << "key为peach的元素已经存在,如下:" << ret.first->first << ":" << ret.first->second << endl;
// 删除key为"apple"的元素
m.erase("apple");
if (m.count("apple")) //count 检测key在map中的个数,只能是1或0
cout << "apple还在" << endl;
else
cout << "apple被删除" << endl;
cout << "剩下的水果有 ->" << endl;
for (auto& e : m)
cout << e.first << ":" << e.second << endl;
}
想要深入了解的伙伴可以查看:multimap文档
下面我就简单介绍一下multimap:
multimap中接口使用与map的使用几乎无异。但有以下几点不同处需要注意:
void TestMultimap1()
{
multimap<string, string> m; //构造一个空的multimap
m.insert(make_pair("李逵", "黑旋风"));
m.insert(make_pair("林冲", "豹子头"));
m.insert(make_pair("鲁达", "花和尚"));
m.insert(make_pair("李逵", "铁牛")); //尝试插入相同key的不同
cout << m.count("李逵") << endl; // 统计key为李逵的元素有多少个
for (auto& e : m)
cout << "<" << e.first << ":" << e.second << endl; //表示插入成功
}
void TestMultimap2()
{
multimap<int, int> m;
for (int i = 0; i < 10; ++i)
m.insert(pair<int, int>(i, i));
for (auto& e : m)
cout << e.first << ":" << e.second << endl;
cout << endl;
// 返回m中大于等于5的第一个元素
auto it = m.lower_bound(5);
cout << it->first << ":" << it->second << endl;
// 返回m中大于5的第一个元素
it = m.upper_bound(5);
cout << it->first << ":" << it->second << endl;
}
STL实现有两种不同结构的数据结构:树形结构和哈希结构。
练习:
1.用map 的接口实现< k,v >模型中以key为关键字的排序map 实现对
2.用map 的接口实现< k,v >模型中以value为关键字的排序58同城秋招笔试题解答
扩展:
STL进阶之树形结构的关联式容器—— set和multiset