15

私はstlの初心者です。これが私の以下のプログラムです。

typedef pair<string, int> p;
int main(int argc, char *argv[])
{
  map<string,int> st;
  st.insert(p("hello",1));   //Inserted "hello" as key to map.
  st.insert(p("HELLO",1));   //Inserted "HELLO" as key to map. 
  cout<<"size="<<st.size()<<endl;    //Output is 2 because two records found "hello" and "HELLO"
  return 0;
}

繰り返される大文字小文字の変更 (大文字から小文字へ、またはその逆) を考慮したくありません。ここで「st.insert(p("HELLO",1));」失敗するはずなので、いいえ。of records は「2」ではなく「1」にする必要があります。フラグの設定などはありますか?

関連する質問が見つからなかったため、この質問を投稿しました。

どんな助けでも感謝しています。

4

2 に答える 2

33

カスタム コンパレータを使用します。

struct comp { 
    bool operator() (const std::string& lhs, const std::string& rhs) const {
        return stricmp(lhs.c_str(), rhs.c_str()) < 0;
    }
};

std::map<std::string, int, comp> st;

編集:stricmp使用または使用 できない場合strcasecmp

#include<algorithm>
//...
string tolower(string s) {
    std::transform(s.begin(), s.end(), s.begin(), ::tolower );
    return s;
}
struct comp { 
    bool operator() (const std::string& lhs, const std::string& rhs) const {
        return  tolower(lhs) < tolower(rhs);
    }
};

std::map<std::string, int, comp> st;
于 2013-09-30T19:29:54.140 に答える
2

これを行うには2つの方法があります

まず、「比較」機能を変更して大文字と小文字を区別しないようにします

2 つ目 - 文字列を使用してマップから値を入力または取得する場合は常に、文字列を小文字に変換する関数でラップします。

最初に行う必要があるのは、2 つの文字列を受け取り、左が右よりも「小さい」かどうかを返す「関数クラス」( operator() を含むクラス) を作成することだけです。

struct my_comparitor{
  bool operator()(const std::string &a, const std::string &b){
    // return iwhether a<b
  }
};

std::map<std::string,DATA_TYPE,my_comparitor> my_map;

2番目はこれを行うだけです:

std::map<std::string,DATA_TYPE> my_map;
my_map.insert(std::make_pair(TO_LOWERCASE("hello"),1));
iter=my_map.find(TO_LOWERCASE(key));
cout << my_map[TO_LOWERCASE(name)];
// etc.

小文字に変換する関数が既に stl の一部であるかどうかはわかりませんが、どちらにしても簡単に記述できます。

于 2013-09-30T19:35:33.287 に答える