【问题标题】:Using the less than comparison operator for strings对字符串使用小于比较运算符
【发布时间】:2012-11-29 13:08:41
【问题描述】:

我正在关注 C++ 教程,并查看字符串并使用 +===!= 等运算符重载。目前我有一个简单的 if 语句:

if(s1 < s2)
    cout << s2 <<endl;
else
  if(s2 < s1)
    cout << s1 << endl;
  else
    cout << "Equal\n";

但这是如何工作的,程序如何确定哪个字符串大于另一个字符串? 环顾四周,我发现了一个基本的模板声明:

template<class charT, class traits, class Allocator>
bool operator< ( const basic_string<charT,traits,Allocator>& lhs,
                 const basic_string<charT,traits,Allocator>& rhs );

这是否定义了&lt; 的工作方式?如果是这样,&lt;charT,traits,Allocator&gt; 是什么意思/做什么?

以下运算符对字符串也有任何意义吗? -=*=

【问题讨论】:

  • 由于std::string 实际上是typedefstd::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt;&gt;,因此该函数模板的一个特定实例是bool std::operator&lt;(const std::string&amp;, const std::string&amp;);,它可能由您的s1 &lt; s2s2 &lt; s1 表达式调用。

标签: c++ operator-overloading string-comparison stdstring


【解决方案1】:

字符串上的小于运算符对字符串进行字典比较。这以与按字典顺序列出字符串相同的方式比较字符串,泛化为适用于具有非字母字符的字符串。

例如:

"a" < "b"
"a" < "ab"
"A" < "a"             (Since A has ASCII value 65; a has a higher ASCII value)
"cat" < "caterpillar"

有关详细信息,请查看 std::lexicographical_compare 算法,小于运算符通常会调用该算法。

对于-=*=,这两个运算符都没有定义在字符串上。唯一定义的“算术”运算符是 ++=,它们执行字符串连接。

希望这会有所帮助!

【讨论】:

  • "A" &lt; "a" 是一个 ASCII 假设,不适用于其他字符集,例如 EBCDIC。 :-)
  • 还可能有一个一般性警告:如果在 UI 中使用字典排序通常是个坏主意。结果不仅取决于实际编码(并且通常令人困惑),而且对于 unicode 来说基本上是完全错误的。
  • 嘿,非常感谢您的回答,知道必须有一个简单的解释!
  • 字符串比较几乎肯定不会调用lexicographical_compare,尽管使用的算法可能相似。
【解决方案2】:

比较运算符实现字符串的lexicographic ordering

-=*= 没有为字符串定义。

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 2017-03-28
    • 2013-08-23
    • 2016-10-22
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多