标题中的“排序”一词可能会误导这里。我正在寻找这种行为:
{ 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++];
}
这可以简化甚至更好,是否可以到位?
答案 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}}