这是一段练习代码。
int main()
{
string s1 = "A string example";
string s2 = "A different string";
if (s1 < s2) {
cout << "true";
} else {
cout << "false";
}
}
让我困惑的是代码坚持认为s2小于s1。我错过了什么,我假设它是根据字符串中的字符数来计算的,那么我错过了什么,因为s1显然有较少的字符?
答案 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()
的函数执行。
词典比较是一项具有以下属性的操作: