使用键和一对值对地图进行排序?

时间:2016-04-15 16:27:25

标签: c++ maps

我正在尝试对具有Key作为String的映射进行排序,以及一对具有unsigned long long的映射,当我使用#include中的sort()方法时,我试图过度加载<运算符但是当我传递地图开头的地址并且结束时我无法访问map.first,map.second.first或map.second.second

有没有人有任何想法

map<string, pair<unsigned long long, unsigned long long>> ext_count;
    sort(map.rbegin(), map.rend()); // to sort descending
bool operator < (map<string, pair<unsigned long long, unsigned long long>>& lhs, map<string, pair<unsigned long long, unsigned long long>>& rhs) {
return lhs.first < rhs.first;

}

1 个答案:

答案 0 :(得分:0)

如评论所示,一种方法是将地图复制到具有不同排序顺序的地图。

以下是完成此操作的一个小例子:

#include <map>
#include <string>
#include <algorithm>
#include <iterator>

// define the Sorter template class.  If sortdir == true, then we sort ascending
template <bool sortdir = true>
struct Sorter
{
    bool operator()(const std::string& left, const std::string& right)
    {
        if ( sortdir )
            return left < right;
        return left > right;
    }
};

// our test maps
typedef std::pair<unsigned long long, unsigned long long> mapDataType;

// ascending map
std::map<std::string, mapDataType, Sorter<>> myMap = 
                            {{"abc", {0,0}}, {"def",{0,1}}};

// descending map
std::map<std::string, mapDataType, Sorter<false>> myMap2; // descending map

// sample program
using namespace std;
int main()
{
    // copy ascending map to descending map
    std::copy(myMap.begin(), myMap.end(), 
              std::inserter(myMap2, myMap2.begin()));
}

请注意,我们使用std::map声明中的第三个参数来指定分拣机谓词。

此外,std::copy函数用于简单地将所有元素从源地图复制到目标地图。

Live Example