【问题标题】:std::set of std::string inequality implementationstd::set of std::string 不等式实现
【发布时间】:2015-11-10 18:58:58
【问题描述】:

由于std::set 被实现为二叉树,它如何比较std::string 的不等式?是不是像a < b && b < a

它是直接使用字符串的长度还是以某种方式对其进行散列? 它是否完全保证字符串的唯一性?

【问题讨论】:

  • std::string 有更大、相等、更少等,参见:en.cppreference.com/w/cpp/string/basic_string/operator_cmp
  • @user1034749,这和问题有什么关系?
  • @user263688 a < b && b < a 显然是错误的伪代码,修复它。
  • 它是!comp(a,b) && !comp(b,a),其中comp(a,b) 默认为a<b

标签: c++ stdstring stdset


【解决方案1】:

它只是少做两次 - 左右交换第二次比较。如果两者都返回 false,则认为字符串相等。

是的,它确实保证了它的成员(包括字符串)的唯一性,只要 operator less 正在做它对成员类型的期望(这对于字符串当然是正确的,但对于用户来说可能不是这样) -定义的类型)。

【讨论】:

  • 不能保证唯一性。就提供的比较运算符而言,它只能保证等价。对于std::set<std::string>,这意味着等价意味着字符串内容的平等,而不是分配的内存量的平等,例如。
  • @Walter 我不明白这一点。你能举个例子,一个元素在一个集合中出现两次吗?您是说如果分配的内存不同,那么您可以设法做到这一点吗?我想我一定错过了一些东西..
  • @Walter 当然,它保证等价,这就是你想要的。您(默认情况下)不希望字符串在一组中出现两次,因为用于存储其信息的内存量不同。如果你确实想要这样的行为,那么你只需指定一个不同的比较函数来使用std::set
  • @Walter 平等是一种等价,人们(技术上不正确)在他们真正意味着等价的地方使用平等。在大多数情况下,我认为这不是什么大问题。
  • @dingalapadum 我从来没有说过一个元素可以在一个集合中出现两次。但是,如果它们比较相等(取决于比较函子),您认为不同的两个元素可能被认为是等效的。
【解决方案2】:

std::set 使用less 对其键进行排序。那是std::string 上的operator<,它按字典顺序比较字符串。

【讨论】:

  • 我想知道为什么显然没有回答问题的答案被接受:)
猜你喜欢
  • 2012-02-06
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2013-11-01
  • 2022-10-22
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多