1

私は新しいc++プログラマーであり、演算子のオーバーロードについて最近知ったばかりです。独立したプロジェクトで作業しているときに問題が発生しましたが、ユーザーが簡単なメニューをナビゲートできるように、ユーザー入力文字列を他の文字列と比較したいと思いました。唯一のことは、大文字と小文字を区別せずに2つの文字列を比較する方法がわからないことです。演算子をオーバーロードするよりもはるかに簡単な方法がある場合は、==私に知らせてください。また、==私は非常に興味があるので、文字列の演算子をオーバーロードする方法も教えてください。

なんて素晴らしいコミュニティでしょう。たくさんの人に感謝します、あなたは私をばかげていると感じさせることなく私の質問に非常に迅速に答えました!

4

2 に答える 2

5

さて、ここでいくつかの点を指摘する必要があります。

  • 文字列がchar配列/ポインタを意味する場合、演算子のオーバーロードはユーザー定義型でのみ許可されるため、演算子==をオーバーロードすることはできません。

  • 文字列が意味する場合、std::string演算子==もオーバーロードできません。これは、すでにオーバーロードされているためです:)

  • 大文字と小文字を区別しない比較を行うための最善のアプローチは、などの名前付き関数を使用することcase_insensitive_equalです。Boostには1つあります-boost::iequals(str1, str2)

  • 大文字と小文字を区別しない文字列型を作成するために独自の文字列を作成することができます。char_traits

大文字と小文字を区別しない方法で文字列を比較する関数を作成する方法については、次のようにします

bool case_insensitive_equal(const std::string& s1, const std::string& s2)
{
    if(s1.length() != s2. length())
       return false;
    for(int i = 0; i < s1.length(); ++i)
        if(std::toupper(s1[i]) != std::toupper(s2[i])) //tolower would do as well
            return false;
    return true;
}

std::transformループの代わりにとを使用できますがstd::equal、これはより効率的だと思います。

于 2013-03-19T07:55:03.917 に答える
2

演算子を名前空間に配置する必要があるoperator==ため、オーバーロードする必要はありません。これは(a)許可されておらず、(b)標準ライブラリの実装によってすでに実行されています。std::stringstd

operator==また、真の平等以外のものを意味するようにanyをオーバーロードすることはお勧めできません。つまり、その場合a == ba同じようbに動作する必要があります。

あなたがしたいのは、意味のある名前で別の関数を書くことです。

bool areEqualIgnoringCase(const std::string&, const std::string&);
于 2013-03-19T07:56:05.300 に答える