如何使用std::map的Compare模板参数进行值比较?
How to use the Compare template parameter of std::map for value comparison?
使用此代码:
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
模板参数,将用作键的比较函数:
但是它还有两个功能return比较对象:
有什么方法可以使用Compare
模板参数进行值比较吗?
Is there any way to use the Compare template parameter for value comparison?
不,没有。 std::map
s 个元素仅根据键排序。
如果您想要 std::pair<char,size_t>
的容器根据 size_t
排序,您可以将 std::set< std::pair<char,size_t>>
与仅比较 second
成员的自定义比较器一起使用.尽管这与您的地图有很大不同,因为该集合仅存储具有唯一 second
的元素(由于自定义比较器),而地图存储具有唯一键的元素。
如果没有其他帮助,您始终可以使用 std::vector< std::pair<char,size_t>>
并使用 std::sort
对其进行排序,并使用 std::find_if
在插入时检查唯一性。
使用此代码:
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
模板参数,将用作键的比较函数:
但是它还有两个功能return比较对象:
有什么方法可以使用Compare
模板参数进行值比较吗?
Is there any way to use the Compare template parameter for value comparison?
不,没有。 std::map
s 个元素仅根据键排序。
如果您想要 std::pair<char,size_t>
的容器根据 size_t
排序,您可以将 std::set< std::pair<char,size_t>>
与仅比较 second
成员的自定义比较器一起使用.尽管这与您的地图有很大不同,因为该集合仅存储具有唯一 second
的元素(由于自定义比较器),而地图存储具有唯一键的元素。
如果没有其他帮助,您始终可以使用 std::vector< std::pair<char,size_t>>
并使用 std::sort
对其进行排序,并使用 std::find_if
在插入时检查唯一性。