使用通用比较器的字符串比较
String comparison using general comparators
我试图看看当我们直接使用 <、> 等运算符比较字符串时会发生什么。下面代码中的两种用法令人惊讶地给出了不同的答案。他们不是完全一样的说话方式吗?
#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;
}
预期结果应始终为"茉莉花"
相关文章:
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 字符串比较中的意外输出
- 如何执行不区分大小写的字符串比较?
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- <<运算符优先级与字符串比较
- ">"运算符和"<"运算符如何进行字符串比较?
- Qt C++11 字符串通过子字符串比较列出交集
- std::out_of_range字符串比较中的异常
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 字符* 与uint8_t的字符串比较
- 用字符串 c++ 比较对向量的元素
- 使用循环进行词典字符串比较
- 如何为C++映射创建自己的字符串比较对象
- 不带比较()的字符串比较
- 与 IF 语句C++的字符串比较?
- 字符串比较在与变量一起使用时给出不同的输出
- 更快的字符串比较排序,用于唯一()
- C 字符串比较“祝您好运”&gt;“再见”
- C 奇怪的行为和字符串比较
- 子字符串与 std::memcmp 或字符串::比较的比较