zoukankan      html  css  js  c++  java
  • 映射(map)

    1)逻辑模型:一一对应,键(信息索引)值(信息内容)对,用于信息检索,检索性能可以对数级(O(logN))。
    2)物理模型:平衡有序二叉树,又名红黑树。
    5 4 3 2 1
               3 
         2          4
    1                    5
    3)键必须是唯一的。
    4)迭代过程实际上是关于键的中序遍历(L-D-R),键升序。
    5)存储单位是由键和值组成的pair。
    template<typename FIRST, typename SECOND>
    class pair {
    public:
    pair (FIRST const& f, SECOND const& s) : first (f), second (s) {}
    FIRST first; // 键
    SECOND second; // 值
    };
    映射的迭代器相当于是指向pair对象的指针。
    6)映射中键都是只读的。
    7)构建和修改性能较差。适用于结构稳定但是频繁检索的场合。
    8)支持"下标"运算,用键做下标,得到对应的值的引用。如果所给出键不存在,会增加一个节点,返回其值,如果键存在,直接返回对应的值。

    注意:只有map支持下标运算,multimap不支持下标运算

        当取一个不存在的key值的value时:如果value为内置类型,其值将被初始化为0;如果value为自定义数据结构且用户定义了默认值则初始化为默认值,否则初始化为0。

      例如:

    map<int,int> emptyMap{};
    int i = emptyMap[100]; // i = 0

    emptyMap[101]++;//可以直接这样使用
    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    class Candidate {
    public:
        Candidate(string const& name = "") :
            m_name(name), m_votes(0) {}
        string const& name(void) const {
            return m_name;
        }
        int votes(void) const {
            return m_votes;
        }
        void vote(void) {
            ++m_votes;
        }
    private:
        string m_name;
        int m_votes;
    };
    int main(void) {
        map<char, Candidate> mcc;
        mcc.insert(pair<char, Candidate>(
            'A', Candidate("张飞")));
        mcc.insert(make_pair(
            'B', Candidate("赵云")));
        mcc['C'] = Candidate("关羽");
        mcc['D'] = Candidate("马超");
        mcc['E'] = Candidate("黄忠");
        typedef map<char, Candidate>::
            iterator IT;
        /*
        pair<IT, bool> res = mcc.insert (
            make_pair ('B',
                Candidate ("杨健")));
        if (! res.second)
            cout << "插入失败!" << endl;
        */
        mcc['B'] = Candidate("杨健");
        IT it = mcc.begin();
        //    it->first = 'X';
        it->second = Candidate("杨健");
        for (int i = 0; i < 10; ++i) {
            for (IT it = mcc.begin(); it !=
                mcc.end(); ++it)
                cout << '(' << it->first
                << ')'
                << it->second.name()
                << ' ';
            cout << endl
                << "请投下宝贵的一票:"
                << flush;
            char key;
            cin >> key;
            IT it = mcc.find(key);
            if (it == mcc.end()) {
                cout << "废票!" << endl;
                continue;
            }
            it->second.vote();
        }
        IT win = mcc.begin();
        for (IT it = mcc.begin(); it !=
            mcc.end(); ++it) {
            cout << it->second.name()
                << "获得"
                << it->second.votes()
                << "票。" << endl;
            if (it->second.votes() >
                win->second.votes())
                win = it;
        }
        cout << "热烈祝贺"
            << win->second.name()
            << "成功当选首席保洁员!" << endl;
        return 0;
    }
  • 相关阅读:
    TCP拥塞控制机制
    C/S 与 B/S 区别
    ext4文件系统新特性
    关于TCP慢启动和拥塞避免的题
    [信息图表]移动学习 Go Study
    [时间线]Android市场的发展
    学习,只有勤奋是不够的……
    UNIX域套接字实例
    程序员的本质
    淘宝Web服务器Tengine正式开源
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/8668475.html
Copyright © 2011-2022 走看看