zoukankan      html  css  js  c++  java
  • 语言基础(25):容器与算法

    1、multimap和multiset 使用

    之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以并不熟悉;这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只是关键字的集合,但是两者都只允许关键字是唯一的,也就是对于一个给定的关键字,它只能允许一个元素的关键字等于它;
    但是,容器multimap和multiset并没有这个限制,它们都允许多个元素具有相同的关键字。	如何访问multimap呢,也就是如何查找元素呢?
    这个时候需要先了解multimap的函数:
    find(k) 返回第一个关键字为k的迭代器
    count(k) 返回关键字等于k的个数
    lower_bound(k) 返回第一个关键字不小于k的元素
    upper_bound(k) 返回第一个关键字大于k的元素
    equal_bound(k) 上面返回的是迭代器,但是这里返回的迭代器pair,表示关键字等于k的元素的范围,若k不存在,pair的两个成员均等于end()
    注意:多个相同的关键字存储在容器中时,则会相邻存储;
    根据以上的函数,可以使用三种方法进行查找元素,下面示例一个maps中包含一个较word的key;
    

    1.1 第一种方法:find + count

    multimap<string, int> maps;
    string word("word");
    //注意是第一个出现的
    auto itr = maps.find(word);
    auto cnt = maps.count(word);
    //循环便利
    while (cnt) {
        cout << itr->second << endl;
        ++itr;
        cnt--;
    }
    

    1.2 第二种方法:lower_bound + upper_bound

    multimap<string, int> maps;
    string word("word");
    //其实就是一个区间,因为存储位置连续
    for (auto beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg) {
        cout << beg->second << endl;
    }
    

    1.3 第三种方法:equal_range

    multimap<string, int> maps;
    string word("word");
    // 和上面不一样,直接返回一个区间
    for (auto pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first) {
        cout << pos.first->second << endl;
    }
    

    multi_set的访问方法和上面类似,但是只存储键没有值!

    对了还有unordered_map,它们是在c++11中如的使用工具,是没有进行排序的map,同样的这些无序容器同样有重复关键字的版本-unordered_multimap,unordered_multiset,这些是用哈希函数实现,没有unordered的则是用红黑树实现的。

    2、STL算法库

    算法库主要包含在下面两个头文件:

    #include <algorithm>   //常用算法
    #include <numeric>     //泛化的算术算法
    

    主要包括了对容器乃至数组的操作:查找、写入、排序等通用型的和特定容器特有的操作,算法库计算效率高、通用型强,避免重复造轮子;

    下面这篇文档介绍的特别好,就不再细说了:
    STL算法

  • 相关阅读:
    keepalived 打印日志
    mysql 主从切换
    mysql 开启只读 普通用户无法写入
    主从复制同步mysql数据库后会导致从上用户无法登陆
    MySQL性能优化的最佳20+条经验(1)
    MySQL性能测试工具之mysqlslap
    关于ad所用端口
    mysql 从设置只读
    ARP表信息引起的telnet 时断时通
    Caused by: java.sql.SQLException: ResultSet is from UPDATE. No Data.
  • 原文地址:https://www.cnblogs.com/wnwin/p/11503846.html
Copyright © 2011-2022 走看看