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

时间:2016-01-18 04:04:20

标签: c++ string

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

#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给出“Jasmine”,而用法2给出“Alladin”。

3 个答案:

答案 0 :(得分:4)

使用时:

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或类似的内容。

答案 1 :(得分:3)

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

您可以比较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;
}

预期结果应始终为“Jasmine”

答案 2 :(得分:3)

您实际上并未比较代码中的字符串。 "Alladin""Jasmine"实际上属于const char[]类型,当您致电max("Alladin", "Jasmine")时,它们会变为指针。这意味着在您的函数中,您要比较字符串的地址而不是内容。

如果您打算测试std::string,则需要创建std::string并将其传递给max函数。