STL或Boost可以帮助按值排序地图吗?

时间:2017-05-16 16:50:16

标签: c++ sorting boost stl stdmap

标题中的“排序”一词可能会误导这里。我正在寻找这种行为:

{ 1: 100,               { 1: 1,
  3: 10,        =>        3: 10,
  5: 1000,                5: 100,
  9: 1 }                  9: 1000 }

即,按升序将值重新分配给现有键。

暂时不难做到这一点:

using K = int;
using V = int;
std::map<K, V> myMap{ {1, 100}, {3, 10}, {5, 1000}, {9, 1} };
std::vector<V> tempVec; // insert map values into vector
std::transform(myMap.begin(), myMap.end(), std::back_inserter(tempVec),
               [](auto const& mapPair) { return mapPair.second; });
std::sort(tempVec.begin(), tempVec.end());
size_t i = 0;
for (auto& mapPair : myMap) {
    mapPair.second = tempVec[i++];
}

这可以简化甚至更好,是否可以到位?

2 个答案:

答案 0 :(得分:1)

如果我们不需要有效的算法,我们可以简单地实现选择排序。

for (auto mi = myMap.begin(); mi != myMap.end(); ++mi) {
    auto const& mini = min_element(mi, myMap.end(), [](auto const& pa, auto const& pb) { return pa.second < pb.second; });
    swap(mi->second, mini->second);
}

答案 1 :(得分:-3)

您无法按值对地图进行排序。

由于std::map按键组织条目以执行它的工作(如O(log n)查找和插入),因此无法更改此行为。

但是,您可以使用std::set<YourType> YourType,其中std::pair是一个元组(如struct YourType { int key; int value; bool operator<(const YourType& other) const { return std::tie(value, key) < std::tie(other.value, other.key); } }; 或自定义类型,如下所示),并提供自定义比较运算符,例如该集合按值组织。

{{1}}