使用通用比较器的字符串比较

String comparison using general comparators

本文关键字:字符串 比较 比较器      更新时间:2023-10-16

我试图看看当我们直接使用 <、> 等运算符比较字符串时会发生什么。下面代码中的两种用法令人惊讶地给出了不同的答案。他们不是完全一样的说话方式吗?

#include <iostream>
template <class T>
T max(T a, T b)
{    
  //Usage 1:
  if (a > b) return a; else return b;
  //Usage 2:
  return a > b ? a : b ;
}
int main()
{
  std::cout << "max("Alladin", "Jasmine") = " << max("Alladin", "Jasmine") << std::endl ;
}

用法 1 给出"茉莉花",而用法 2 给出"Alladin"。

当您使用时:

max("Alladin", "Jasmine")

它相当于使用:

max<char const*>("Alladin", "Jasmine")

在该函数中,您最终会比较指针。调用的结果将取决于指针的值。它不能保证是可预测的。

也许您想使用:

max(std::string("Alladin"), std::string("Jasmine"))

max<std::string>("Alladin", "Jasmine")

请注意,某些编译器在使用它时可能会拾取std::max。您可能希望将max更改为my_max或类似的东西。

您实际上并没有比较代码中的字符串。 "Alladin""Jasmine" 实际上是const char[]类型,当您调用 max("Alladin", "Jasmine") 时,它们会衰减为指针。 这意味着在您的函数中,您正在比较字符串的地址而不是内容。

如果你打算测试std::string,那么你需要创建std::string s并将它们传递给你的max函数。

这两种方法都是错误的。字符串没有有效的>运算符。

您可以改为比较std::string

#include <iostream>
#include <string>
template <class T>
T my_max(T a, T b)
{
    return a > b ? a : b;
}
int main()
{
    std::string a = "Alladin";
    std::string b = "Jasmine";
    std::cout << "my max: " << my_max(a, b) << std::endl;
    //standard max function:
    std::cout << "standard max: " << max(a, b) << std::endl;
}

预期结果应始终为"茉莉花"