【发布时间】:2021-08-19 10:48:18
【问题描述】:
使用此代码:
namespace nonstd {
template <class Key,
class T,
class Compare = std::greater<T>,
class Allocator = std::allocator<std::pair<Key const, T>>
>
using map = std::map<Key, T, Compare, Allocator>;
}
int main() {
nonstd::map<char, std::size_t> const values = {
{'A', 3}, {'B', 2}, {'C', 5}
};
for (auto const& value : values) {
std::clog << value.first << " : " << value.second << std::endl;
}
}
我希望:
C : 5
A : 3
B : 2
但我得到了:
C : 5
B : 2 // <---
A : 3
我检查了std::map 的GNU 实现,我看到我们传递的Compare 模板参数将用作Key 的比较函数:
但它也有两个函数返回比较对象:
有没有办法使用Compare模板参数进行值比较?
【问题讨论】:
-
元素是根据键而不是映射值排序的。这与您的
nonstd::map无关 -
这必须是XY problem。
-
为什么要对映射的值进行排序?严格来说,那不是
map。还有其他容器可以根据其元素的second成员进行排序 -
@StoryTeller-UnslanderMonica,只是好奇和学习。
-
库实现中类的私有部分并不是了解如何使用标准容器的最佳场所。您可以在那里挖掘以了解实施细节,但要做好努力的准备。