Sorting a std::map by value before output & destroy

后端 未结 5 898
天涯浪人
天涯浪人 2020-12-01 11:30

I\'m aware that map is not prepared to be sorted. It\'s heavily optimized for fast and random key access and actually doesn\'t support std::sort.

My cur

5条回答
  •  北荒
    北荒 (楼主)
    2020-12-01 11:59

    For iterating by value you could use boost::multi_index. It will looks as follows:

    #include 
    #include 
    #include 
    #include 
    using namespace boost::multi_index;
    
    struct X {
      X( std::string val_str, int val_int ) : val_str(val_str), val_int(val_int) {};
      std::string val_str;
      int         val_int;
    };
    
    typedef multi_index_container<
        X,
        indexed_by<
            hashed_unique< member >,
            ordered_non_unique< member >
        >
    > X_map;
    
    void func()
    {
       X_map data;
       data.insert( X("test", 1) );
       // ...
    
       // search by val_str 
       // complexity is equal to O(1) for hashed index (worst cast O(n) ), 
       // and O(log n) for ordered index
       X_map::const_iterator it = data.find( "test" );
       // ...
    
       // iterate in order of val_int
       size_t N = 0;
       for ( X_map::nth_index<1>::type::const_iterator it = data.get<1>().begin(); N < 10 && it != data.get<1>().end(); ++it, ++N ) {
         // copy elements somewhere
       }
    }
    

    You could use any index for iteration ( val_str or val_int ).

提交回复
热议问题