zoukankan      html  css  js  c++  java
  • multimap详讲

    multimap和map的区别:

    首先认识一下multimap和map的区别:

    1>        multimap不提供operator[ ]运算符。因为这个运算符的语义在同一个键可以保存多个值的容器multimap里是无意义的。

    2>        multimap插入元素的时候总是能成功的。所以插入insert()方法只返回一个iterator。不像是map的insert()返回的是《iterator , bool》.

    麻烦的是multimap查找元素的时候,因为这里不提供operator[ ],而find(key)返回的可能是多个元素,这也不准确。但是multimap提供了lower_bound()和upper_bound()函数;

    分别返回的是同一个健的第一个元素得迭代器和最后一个元素得下一个元素得迭代器。注意的是,如果没有这个键值,则lower_bound和upper_bound是相同得;还有一个方法就是使用equal_bound()方法。这个函数返回的是两个iterator得std::pair<>(分别是lower_bound()和upper_bound()得迭代器);

    #include <iostream>
    #include <map>
    #include <utility>      //utility是实用性工具类得意思
    #include <list>
    
    class Buddylist
    {
    public:
        void addBuddy(const std::string &name , const std::string &buddy);
        bool isBuddy(const std::string &name , const std::string &buddy);
        void delBuddy(const std::string &name , const std::string &buddy);
        std::list<std::string> getBuddies(const std::string &name) const;
    
    private:
        std::multimap<std::string , std::string> mBuddies;
    };
    
    void Buddylist::addBuddy(const std::string &name , const std::string &buddy)
    {
        if(!isBuddy(name,buddy))
        {
            mBuddies.insert({name,buddy});
        }
    }
    bool Buddylist::isBuddy(const std::string &name , const std::string &buddy)
    {
        auto iter = mBuddies.equal_range(name); //返回的是key = name得这个范围的所有得值对应的迭代器
        auto Beg = iter.first;      //这些元素的首迭代器
        auto End = iter.second;     //最后元素得后一个得迭代器
        for(;Beg != End;++Beg)
        {
            if(Beg->second == buddy)
            {
                return true;
            }
        }
        return false;
    
    }
    void Buddylist::delBuddy(const std::string &name , const std::string &buddy)
    {
        auto Beg = mBuddies.lower_bound(name);
        auto End = mBuddies.upper_bound(name);
        while(Beg != End)
        {
            if(Beg->second == buddy)
            {
                mBuddies.erase(Beg);
                break;
            }
            ++Beg;
        }
    }
    std::list<std::string>Buddylist::getBuddies(const std::string &name) const
    {
        auto range = mBuddies.equal_range(name);
        auto Beg = range.first;
        auto End = range.second;
        std::list<std::string> mNameList;
        while(Beg != End)
        {
            mNameList.push_back(Beg->second);
            ++Beg;
        }
        return mNameList;
    }
    int main()
    {
        Buddylist buddy1,buddy2;
        std::list<std::string> list_1,list_2;
        buddy1.addBuddy("list_1","wenjie");
        buddy1.addBuddy("list_1","meijun");
        buddy1.addBuddy("list_1","taoge");
        buddy1.addBuddy("list_1","dajun");
    
        buddy1.delBuddy("list_1","taoge");
        list_1 = buddy1.getBuddies("list_1");
        for(auto &iter : list_1)
        {
            std::cout << "list_1 : " << iter << std::endl;
        }
    
        buddy2.addBuddy("list_2","abcd");
        buddy2.addBuddy("list_2","fefg");
        buddy2.addBuddy("list_2","jhnf");
        buddy2.addBuddy("list_2","errh");
    
        list_2 = buddy2.getBuddies("list_2");
        for(std::list<std::string>::iterator iter = list_2.begin();
                iter != list_2.end();++iter)
        {
            std::cout << "list_2 : " << *iter << std::endl;
        }
    
        return 0;
    }

    结果是:

    list_1 : wenjie
    list_1 : meijun
    list_1 : dajun
    list_2 : abcd
    list_2 : fefg
    list_2 : jhnf
    list_2 : errh

     

  • 相关阅读:
    Hbase 0.98集群搭建的详细步骤
    java使用Apache POI操作excel文件
    linux下用非root用户重启导致ssh无法连接的问题
    solr update
    solr(一)
    libreoffice
    git
    hbase基本操作
    http://webapp.docx4java.org/OnlineDemo/PartsList.html
    git
  • 原文地址:https://www.cnblogs.com/boost/p/10413903.html
Copyright © 2011-2022 走看看