目录
1.关联式容器与序列式容器
2.键值对与pair
3.set
4.map
4.1map的插入与修改
4.2map的迭代器使用
4.3map中[ ]的巧妙用法
1.关联式容器与序列式容器
序列式容器(vector、list、deque…):其底层为线性序列的数据结构,里面存储的是元素本身。
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高。
2.键值对与pair
键值对:
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
pair:
是一个KV结构的类,一般称之为KV键值对
树型结构的关联式容器主要有四种:map、set、multimap、multiset。
这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。
3.set
set的本质是Key模型,可以实现排序+去重的功能。其底层是二叉平衡搜索树
在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
4.map
map是KV结构,根据key可以找到value
4.1map的插入与修改
1.insert pair匿名对象
2.使用 [ ]插入
3.insert (make_pair())
map<string, string> dict;
//1.用匿名对象初始化插入
dict.insert(pair<string, string>("排序", "sort"));
//2.举例方括号用来插入
dict["我爱学习"] = "I love study";
//dict["我爱学习"]其实就是在插入,这里插入的value就是string的默认对象缺省值,nullptr
//后面 = 在value的值修改
dict["insert"];//单纯的插入 []中传入一个不存在的值,就是插入,此时的value就是默认构造出的 0
dict["insert"] = "插入";//对于已经存在的key值,让其等于一个值,就是修改它的value
dict.insert(pair<string, string>("排序", "xxx"));//会插入失败,搜索树只比较key,根据key来判断是否插入
//3.make_pair
dict.insert(make_pair("字符串", "string"));
4.2map的迭代器使用
map<string, string>::iterator it = dict.begin();
auto it = dict.begin();
//以上两种方法都能获得迭代器
while (it != dict.end())
{
//cpp中如果使用struct定义一个类,大概率就不会对这个类的调用做限制
//map中采用pair,而不是单独定义两个类成员的原因,因为迭代器中*it只能返回一个对象,所以采用pair类一起返回
cout << (*it).first << " " << (*it).second << endl;
cout << it->first << " " << it->second << endl;
//上面两个方法都可以通过迭代器访问数据
++it;
}
cout << endl;
for (const auto& kv : dict)//是把dict迭代器的 *it赋值给了kv
//建议加上引用,减少拷贝构造,提高效率
//如果不改变其内容,加上const更安全
{
cout << kv.first << " " << kv.second << endl;
}
4.3map中[ ]的巧妙用法
cpp[]有三种功能: 1.插入 2.查找 3.修改
在map中 1.插入key,value为0(在这个值不存在时)
2.查找 3.修改value(2.3.这个值在的时候
// 统计水果出现的次数
string arr[] = { "苹果", "西瓜", "香蕉", "草莓", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
map<string, int> fruitCount;
///
//巧妙写法
for (auto& ch : arr)
{
fruitCount[ch]++;
//方括号是用来支持随机访问的
//这里[]实质上调用的是insert
/*
*
mapped_type& operator[] (const key_type& k)
{
return (*((this->insert(make_pair(k,mapped_type()))).first)).second
//mapped_type() //就是这个pair.second的匿名构造,这里的类型是int,传入是int的匿名构造对象,就是0
}
pair<iterator,bool> insert (const value_type& val);
//insert 返回值的官方文档
The single element versions (1) return a pair,
with its member pair::first set to an iterator pointing to either the newly inserted element or to the element with an equivalent key in the map.
The pair::second element in the pair is set to true if a new element was inserted or false if an equivalent key already existed.
//上面官方的 [] 等价于下面的写法
V&operator[](constK&k)
{
pair<iterator,bool> ret =insert(make_pair(k,V()));
return ret.first->second;
}
*/
}
for (const auto& kv : fruitCount)
{
cout << kv.first << ":" << kv.second << endl;
}
🍭最后
过年好✨