【发布时间】:2017-10-15 21:06:22
【问题描述】:
标题中的“排序”一词在这里可能会产生误导。我正在寻找这种行为:
{ 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++];
}
这可以简化甚至更好地完成吗?
【问题讨论】:
-
从技术上讲,如果键或值是用户定义的类型,您可以为映射的
value_type重载 std::swap(如果它们依赖,您可以在 std:: 命名空间中添加重载在使用定义的类型上)仅交换值部分,然后将 std::sort 与自定义比较器一起使用。在实践中,这不是一个好主意。 -
@Revolver_Ocelot 缺点是在需要默认行为的上下文中很难摆脱自定义重载,对吧?
-
是的。但是,由于 map 的
value_type是pair<const key, value>,其默认行为是 编译错误,我不认为 this 是问题所在。人们看着std::sort而不是std::map并试图弄清楚这是什么巫术,但这是一个问题。 -
感觉像是 XY 问题。如果键不必与值一起使用,为什么要使用地图?好像你想要两个大小相等的排序向量,或者两个集合或其他东西。
-
myMap[mapPair.first] = tempVec[i++]应该是mapPair.second = tempVec[i++]。
标签: c++ sorting boost stl stdmap