zoukankan      html  css  js  c++  java
  • ###学习《C++ Primer》- 4

    点击查看Evernote原文

    #@author:       gr
    #@date:         2014-10-16
    #@email:        forgerui@gmail.com
    

    Part 4: STL关联容器(第11章)

    一、pair类型

    pair类型的数据成员是public的,两个成员分别命名为first, second

    #下面两种造价
    pair<string, string> p(v1, v2);
    pair<string, string> p = {v1, v2};
    #使用make_pair构造
    make_pair(v.back(), v.back().size());
    

    二、容器关键字

    对于set类型,key_typevalue_type是一致的。在map中,value_typepair类型的,key_type是键类型,mapped_type是值的类型。

    set<string>::value_type v1;         //v1是一个string
    set<string>::key_type v2;           //v2是一个string
    map<string, int>::value_type v3;    //v3是一个pair<string, int>
    map<string, int>::key_type v4;      //v4是一个string
    map<string, int>::mapped_type v5;   //v5是一个int
    

    三、关联容器迭代器

    mapvalue_type类型是一个pair类型,其first成员是const的,second是成员保存值。
    set关键字也是const的,可以用set迭代器读取其值,但不能修改

    四、添加元素

    word_count.insert({word, 1});
    word_count.insert(make_pair(word, 1));
    word_count.insert(pair<string, size_t>(word, 1));
    word_count.insert(map<string, size_t>::value_type(word, 1));
    

    mapinsert的返回值是个pair类型,first代表迭代器,secondbool类型,表示是否插入成功,成功返回true

    //返回值是个pair类型
    pair< map<string, size_t>::iterator, bool> ret = word_cout.insert({word, 1});
    cout<< ret.first->second << endl;
    

    multimapinsert只会返回迭代器,因为它的插入总是成功的。

    五、删除元素

    三种erase,一种是传递迭代器,返回void;第二种是传递一组迭代器表示一个范围,erase(b, e);,返回e;第三种是传递一个key_type参数,删除匹配的关键字,返回删除元素的数量。

    六、map的下标操作

    set不支持下标操作。multimap也没有,因为可能有多个匹配项。

    下标操作如果存在会获取关联的值,如果不存在会自动创建该值插入到map中。所以不能使用下标判断元素是否存在

    七、使用find查找元素

    find接受一个key_value类型值,返回一个迭代器。

    c.find(k);
    if (word_count.find("hello") == word_count.end())
        cout << "the element is not in the map" << endl;
    

    还可以使用cout查找元素个数。
    multimapmultiset中查找元素。

    string item = "Lee Seng";
    auto entries = autors.count(item);
    auto iter = authors.find(item);
    while (entries){
        cout << iter->second << endl;
        ++iter;
        --entries;
    }
    

    lower_bound(k)返回第一个关键字不小于k的元素,同理upper_bound()返回第一个关键字大于k的元素。

    for (auto beg = authors.lower_bound(item),
            end = authors.upper_bound(item); beg != end; ++beg)
    {
        cout << beg->second << endl;        
    }
    

    equal_range整合了lower_boundupper_bound,返回一个pair,firstlower_bound的结果,secondupper_bound的结果。

    for (auto range = authors.equal_range(item); range.first != range.second; ++range.first)
    {
        cout << range.first->second << endl;
    }
    

    八、无序容器

    新标准定义了4个无序关联容器,分别在基础的容器前加上unordered_,分别是unordered_map, unordered_multimap, unordered_setunordered_multiset。它们不使用比较运算符而使用哈希函数来组织元素。

    定义自己的hash函数==运算符

    //hash函数
    size_t hasher(const Sales_data& sd){
        return hash<string>()(sd.isbn());
    }
    //==运算符
    bool eqOp(const Sales_data& lhs, const Sales_data& rhs){
        return lhs.isbn() == rhs.isbn();
    }
    //定义一个unordered_multiset类型别名
    using SD_multiset = unordered_multiset(Sales_data, decltype(hasher)*, decltyhpe(eqOp)*);
    SD_multiset bookstore(42, hasher, eqOp);
  • 相关阅读:
    根据坐标点画图形
    js 解析geojson格式
    devexpress 安装
    DataTable 获取列名
    ADO.NET 注册
    css:outline
    javascript函数sort
    引用类型-2015/10/06
    2015-11-02-js
    jquery
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4128710.html
Copyright © 2011-2022 走看看