std::unordered_set 的 C++ 比较运算符
C++ Comparison operators for std::unordered_set
post 提出了一个问题,即 C++ 中无序容器缺少 >
、<
.. 比较运算符。从回复来看,拥有这些似乎毫无意义。
但是,我检查了 Python 并看到 set
类型支持子集和超集操作。 Python set
是一个散列 table。我们可以轻松做到:
{'1', '6', 't', 'j'} > {'1', '6', 'j'} # superset
True
{'1', '6', 'j', 't'} < {'1', '6', 'j'} # subset
False
如何在 C++ 中为散列 table (std::unordered_set
) 实现比较运算符?或者我们必须坚持 std::set
进行除相等以外的任何比较?
基于子集关系,Python 的集合具有偏序,而不是全序。例如。 { 1, 2, 3 } < { 2, 3, 4 }
和 { 1, 2, 3 } > { 2, 3, 4 }
都不是真的,但是 { 1, 2, 3 } == { 2, 3, 4 }
是假的。
您可以编写一个表现类似的 <
,但如评论中所述,您不能将它放在 namespace std
中,因此在某些上下文中找不到它。
我建议改为制作免费功能
template<typename UnorderedContainer>
bool is_proper_subset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
您还可以为 <=
、>
和 >=
(分别)
template<typename UnorderedContainer>
bool is_subset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
template<typename UnorderedContainer>
bool is_proper_superset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
template<typename UnorderedContainer>
bool is_superset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
>
、<
.. 比较运算符。从回复来看,拥有这些似乎毫无意义。
但是,我检查了 Python 并看到 set
类型支持子集和超集操作。 Python set
是一个散列 table。我们可以轻松做到:
{'1', '6', 't', 'j'} > {'1', '6', 'j'} # superset
True
{'1', '6', 'j', 't'} < {'1', '6', 'j'} # subset
False
如何在 C++ 中为散列 table (std::unordered_set
) 实现比较运算符?或者我们必须坚持 std::set
进行除相等以外的任何比较?
Python 的集合具有偏序,而不是全序。例如。 { 1, 2, 3 } < { 2, 3, 4 }
和 { 1, 2, 3 } > { 2, 3, 4 }
都不是真的,但是 { 1, 2, 3 } == { 2, 3, 4 }
是假的。
您可以编写一个表现类似的 <
,但如评论中所述,您不能将它放在 namespace std
中,因此在某些上下文中找不到它。
我建议改为制作免费功能
template<typename UnorderedContainer>
bool is_proper_subset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
您还可以为 <=
、>
和 >=
(分别)
template<typename UnorderedContainer>
bool is_subset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
template<typename UnorderedContainer>
bool is_proper_superset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);
template<typename UnorderedContainer>
bool is_superset(const UnorderedContainer & lhs, const UnorderedContainer & rhs);