《C++ Primer 第5版》-11.3关联容器操作-康奈尔笔记

引入:2018年10月看《C++ Primer 第5版》而写的简单笔记

11.3.1关联容器迭代器

  1. 关联容器操作
  2. 关联容器迭代器
  3. Set的迭代器是const的
  4. 遍历关联容器
  5. 关联容器和算法

Set:key_type value_type

Map: key_type value_type mapped_type

 set<string>::key_type v1;

 set<string>::value_type v2;

 map<string, int>::value_type v3;

map<string, int>::key_type v4;

map<string, int>::mapped_type v5;

1. 关联容器操作

1) Set的key_type与value_type是一样的

2) Map的value_type是pair,first是关键字类型,second是value类型

     Mapped_type是值类型,key_type是关键字类型

2. 关联容器迭代器

1) 解引用关联容器的迭代器或得到value_type类型的值引用。对于map来说是pair类型。

2) Pair的关键字是const的不能改变,second是值,可以改变值不能改变关键字

3. Set的迭代器是const的

1) set的迭代器是const的,set的关键字也是const的 不能修改

2) 即使有iterator与constiterator但是都一样不能修改

4. 遍历关联容器

1) 遍历关联容器 可以用迭代器

Note:迭代器按关键字升序遍历元素

5. 关联容器和算法

1) 因为关键字是const的不能用于泛型算法中重排容器元素的算法

2) 关联容器不能通过关键字快速查找,使用泛型算法的find是个坏主意,可以使用关联容器自定义的find的成员,给定关键字直接获取元素。

3) 若想使用泛型算法,可以把关联容器当做原序列或目的位置,如:copy算法将元素从一个关联容器到另一个序列,与inserter插入器绑定到一个关联容器做目的位置

11.3.2添加元素

  1. 添加元素
  2. 向map添加元素
  3. 检测insert的返回值
  4. 展开递增语句
  5. 向multiset或multimap添加元素

Insert

set1.insert(ive1.cbegin(), ive1.cend());

set1.insert({ 1,3,4,5,7,1,3,7 });

map1.insert({"st", 1});

map1.insert(make_pair("st", 1 ));

map1.insert(pair<string,size_t> ( "st", 1 ));

map1.insert(map<string,size_t>::value_type( "st", 1 ));

auto paisreturn = word_count2.insert({cinstr,1});

++(( paisreturn.first)->second);

Pair<map<string,size_t>::iterator,bool> ..

mulmap1.insert({ "liujianjie","b" });

1. 添加元素

1) 关联容器通过insert添加,若添加已有关键字的值不影响map与set。

2) Insert两个版本。一个接受迭代器,一个初始化器列表

2. 向map添加元素

1) '需是pair类型,可以用4中方法构造。

3. 检测insert的返回值

1) Insert返回的类型是Pair<map<string,size_t>::iterator,bool>

2) 一个pair,pair的first是一个迭代器也是一个pair一样,second是一个bool表示是否成功

4. 展开递增语句

1) ….

5. 向multiset或multimap添加元素

1) 插入总是成功,所以insert返回的pair无bool

11.3.3删除元素

  1. 删除元素

map<int, int> map1{ {1,1},{ 2,2 },{ 3,3 },{ 4,4 },{ 5,5 } };

map1.erase(5);

1. 删除元素

1) Earse三个版本

        一个迭代器 返回void

        一对迭代器 返回void

        一个key_type 返回删除的数量

2)返回数量1或0,但若是可重复的返回多个

11.3.4map的下标操作

  1. map的下标操作
  2. 使用下标操作的返回值

map<int, int> map1{ { 1,1 },{ 2,2 },{ 3,3 },{ 4,4 },{ 5,5 } };

int a1 = map1.at(2);

map1[6] = 6;

1. map的下标操作

1) map和unordered_map容器提供了下标运算符和at函数

2) set不支持下标,因为set么有关键字相连的值,没有意义

3)不能对multimap与unorderred_multimap进行下标操作,因为这些容器中有可能有多个值与一个关键字相关联

4)Map的下标运算符,如果关键字不存在map,会创建一个元素并插入到map中,关联值将进行初始化。

      步骤:

      [1].搜索Anna元素,未找到

     [2].将新的关键字-值对插入到word_count中,关键字是一个conststring,保存anna,值进行值初始化,为0

      [3].提取新插入的元素,并将值1赋予它

5) 只能非const的map和unordered_map

2. 使用下标操作的返回值

1)map的下标运算(返回mapped_type)与解引用一个迭代器返回的类型不同(返回value_type)

2)正常的下标运算与解引用迭代器得到同样的类型

3)相同的是返回的是左值,可以修改

11.3.5访问元素

  1. 访问元素
  2. 对map使用find代替下标操作
  3. 在multimap或multiset中查找元素
  4. 一种不同的,面向迭代器的解决方法
  5. Equal_range函数

set1.count(4)

set1.find(4)

map1.find(4) == map1.end()

lower_bound upper_bound

queal_range

1. 访问元素

1)有多种查找一个指定元素

2)Find与count差不多,但在可重复的容器中,不想计数 就用find

2. 对map使用find代替下标操作

1)下标会有额外工作,所以用find,找到就找到指向关键字为k的迭代器,没有就为end尾后迭代器

3. 在multimap或multiset中查找元素

1)允许重复关键字中,查找所有关键字所对应的元素。

2)因为可重复容器的元素会相邻存储,所以可以find与count配合使用,count控制循环,find找到的迭代器前进多少

4. 一种不同的,面向迭代器的解决方法

1)lower_bound upper_bound得到迭代器范围

2)若给定关键字是容器的关键字最大的,则upper_bound返回尾后迭代器,若关键字不存在,且大于容器中任何关键字,则lower_bound返回的也是尾后迭代器

Note:若关键字不在容器中,low_bound返回关键字的第一个安全插入点-不影响容器中元素顺序的插入位置。

Note:lower_bound与upper_bound返回相同的迭代器,则给定的关键字不在容器中

5. Equal_range函数

1)接受一个关键字,返回一个pair,first为第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。未找到,两个迭代器都指向关键字可以插入的位置

2)Pair<map<string,size_t>,map<string,size_t>>;访问pair.fisrt->second;

代码:

    multimap<string, string> mulmap1({ {"liu","c"} ,{ "liu2","c" } ,{ "liu3","c" } ,{ "liu","a" } ,{ "liu","b" } });

    string search_item("liu");

    auto entries = mulmap1.count("liu");

    auto iter1 = mulmap1.find(search_item);

    while (entries) {

         cout << (*iter1).second << endl;

         ++iter1;

         --entries;

    }

    auto beg = mulmap1.lower_bound("liu");

    auto end = mulmap1.upper_bound("liu");

    while (beg != end) {

         cout << (*beg).second << endl;

         ++beg;

    }

    auto range1 = mulmap1.equal_range("liu");

    while (range1.first != range1.second) {

         cout << range1.first->second << endl;

         cout << (*range1.first).second << endl;

         ++range1.first;

    }

11.3.6一个单词转换的map

例子...略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘建杰

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值