代码之家  ›  专栏  ›  技术社区  ›  dmckee --- ex-moderator kitten

如何了解两个'std::multimap'是否具有相同的内容?

  •  2
  • dmckee --- ex-moderator kitten  · 技术社区  · 7 年前

    我不得不承认,我从未对标准图书馆进行过适当的研究,但这让我大吃一惊

    #include <iostream>
    #include <map>
    
    int main (int argc, char ** argv)
    {
        std::multimap<int, int> mm1;
        mm1.insert( std::pair<int, int>(0, 0) );
        mm1.insert( std::pair<int, int>(0, 1) );
    
        std::multimap<int, int> mm2;
        mm2.insert( std::pair<int, int>(0, 1) );
        mm2.insert( std::pair<int, int>(0, 0) );
    
        std::cout << "The maps are "
              << ( (mm1 == mm2) ? "equal" : "not equal" )
              << std::endl;
    }
    

    尝试一下,我们得到了。。。

    $ g++ --std=c++11 -o multimaporder multimaporder.cc
    $ ./multimaporder 
    The maps are not equal
    

    使用随机访问容器,我的下一个计划通常是对它们进行排序,然后比较。。。但是增加

    #include <algorithm>
    //...
        std::sort( mm1.begin(), mm1.end() );
        std::sort( mm2.begin(), mm2.end() );
    
        std::cout << "The *sorted* maps are "
                  << ( (mm1 == mm2) ? "equal" : "not equal" )
                  << std::endl;
    

    just results是关于找不到一组可接受的迭代器的抱怨 sort

    那么,如果两个 multimap 有相同的内容吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Slava    7 年前

    所以,你把东西放到地图上的顺序很重要。

    不,这与地图无关,但您使用的是multimap,它是一种不同的野兽。如以下文件所述: std::multimap::insert()

    1-2)插入值。 如果容器包含具有等效键的元素,则在该范围的上限处插入。(自C++11起) 过载(2)相当于布设(std::forward

    重点是我的。因此,可能的解决办法:

    • 将值插入到 std::multimap std::multimap::insert
    • 例如,使用所有对完全排序的容器 std::set<std::pair<int,int>>

    注意,不能在中使用元素 std::sort ,这将打破容器不变性。

        2
  •  1
  •   NathanOliver    7 年前

    [associative.reqmts]/4 std::multimap

    如果您不关心订单,可以使用 std::unordered_multimap 它不关心顺序,只要它们具有相同的值,就可以进行相等的比较

    int main (int argc, char ** argv)
    {
        std::unordered_multimap<int, int> mm1;
        mm1.insert( std::pair<int, int>(0, 0) );
        mm1.insert( std::pair<int, int>(0, 1) );
    
        std::unordered_multimap<int, int> mm2;
        mm2.insert( std::pair<int, int>(0, 1) );
        mm2.insert( std::pair<int, int>(0, 0) );
    
        std::cout << "The maps are "
              << ( (mm1 == mm2) ? "equal" : "not equal" )
              << std::endl;
    }
    

    The maps are equal
    
        3
  •  1
  •   balki    7 年前

    对于这种情况,您需要比较如下所示的集合

    bool comp ()
    {
        using Map = std::multimap<int, int>;
        Map mm1;
        mm1.insert( std::pair<int, int>(0, 0) );
        mm1.insert( std::pair<int, int>(0, 1) );
    
        Map mm2;
        mm2.insert( std::pair<int, int>(0, 1) );
        mm2.insert( std::pair<int, int>(0, 0) );
    
    
        return std::set<Map::value_type>(mm1.begin(), mm1.end()) == std::set<Map::value_type>(mm2.begin(), mm2.end());
    }
    
    推荐文章