这段代码如何运作?

时间:2014-07-07 03:00:07

标签: c++ string

这是一段练习代码。

int main()
{
    string s1 = "A string example";
    string s2 = "A different string";

    if (s1 < s2) {
        cout << "true";
    } else {
        cout << "false";
    }
}
让我困惑的是代码坚持认为s2小于s1。我错过了什么,我假设它是根据字符串中的字符数来计算的,那么我错过了什么,因为s1显然有较少的字符?

4 个答案:

答案 0 :(得分:4)

使用字符串中字符的ASCII值计算它。在这种情况下,第一个不同的字符是's'中的s1'd'中的s2。自'd' < 's'起,比较评估为false

答案 1 :(得分:2)

如上所述,另一个答案是,评估每个字符串中每个字符的数字ASCII值,以确定string s1 &lt; string s2

#include <iostream>
#include <string>

using namespace std;

int main (int argc, char ** argv)
{
    string s1 = "A string example";
    string s2 = "A different string";
    if (s1 < s2) {
        cout << "true";
    }
    else
    {
        cout << "false";
    }
    return 0;
}

应用程序输出

false

除了您的问题,要在比较中确定字符length,以下代码将完成此操作,因为每个length的{​​{1}}方法用于比较:

string

应用程序输出

#include <iostream>
#include <string>

using namespace std;

int main (int argc, char ** argv)
{
    string s1 = "A string example";
    string s2 = "A different string";
    if (s1.length() < s2.length()) {
        cout << "true";
    }
    else
    {
        cout << "false";
    }
    return 0;
}

答案 2 :(得分:0)

你偶然发现了这样一个事实:&#34;是否小于&#34; &#34;大于&#34; 一些可能的解释。碰巧的是,std::string这个类默认使用词典顺序。这导致你可能认为是违反直觉的结果,比如&#34; 2&#34;大于&#34; 10&#34;。

这是一个基本问题......因为能够以已知顺序对事物进行排序在C ++中非常重要。实际上,对于许多集合,您可以传递一个比例函数,该函数与您使用<运算符时的默认值不同。请参阅std::less,以及如何在集合中覆盖它,例如&#39; map&#39;。

从某种意义上说,没有对错,但必须有一致的排序。 可以使用您自己的规则创建自己的字符串类,其中较长的字符串更大......但正如您所指出的那样,这也将带来对平等的影响。

答案 3 :(得分:0)

  

我假设它通过字符串

中的字符数来计算

您的假设不正确。

s1 < s2调用标准库中的following function

template< class CharT, class traits, class Alloc >
bool operator<( const basic_string<CharT,Traits,Alloc>& lhs, 
                const basic_string<CharT,Traits,Alloc>& rhs );

比较完成lexicographically,由相当于std::lexicographical_compare()的函数执行。

词典比较是一项具有以下属性的操作:

  • 逐个元素地比较两个范围。
  • 第一个不匹配 element定义哪个范围按字典顺序小于或大于 另一个。
  • 如果一个范围是另一个范围的前缀,则范围较短 词典上比另一个少。
  • 如果两个范围具有相同的范围 元素和长度相同,那么范围是 按字典顺序排列。
  • 空字距在字典上较少 比任何非空范围。
  • 两个空的范围按字典顺序排列 相等。