簡體   English   中英

使用通用比較器進行字符串比較

[英]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給出“阿拉丁”。

使用時:

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或類似的內容。

兩種方法都是錯誤的。 字符串沒有有效的>運算符。

您可以改為比較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;
}

預期結果應始終為“茉莉花”

您實際上並沒有在代碼中比較字符串。 "Alladin""Jasmine"實際上是const char[]類型,當您調用max("Alladin", "Jasmine")時,它們會衰減為指針。 這意味着在函數中,您是在比較字符串的地址而不是內容。

如果要測試std::string則需要創建std::string ,並將它們傳遞給max函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM