2

私は小さなプログラムを持っています。マップ内の特定の文字列を検索しようとしています。静的な const 文字列「us」を渡すと正しい結果が得られますが、文字列をポインターにコピーすると機能しません。どういうわけか、渡された文字列のアドレスを比較しようとしていると思います。何らかの理由で std::string を取り除く予定です。

using namespace std;

static struct MarketLang {
    const char* market;
    const char* lang;
} market_lang[] = {
    {"us",  "all"},
    {"el",  "en,fr,it,de,es"},
    {"xx",  "na"},
};

class MarketLangMap {
    map<const char*, MarketLang *> table;
    public:
    MarketLangMap() {
        int TOTAL_MARKET_INFO = sizeof(market_lang)/sizeof(MarketLang);
        for (int i = 0; i < TOTAL_MARKET_INFO; i++) {
            table[market_lang[i].market] = market_lang+ i;
        }
    }

    MarketLang *operator[](const char* s) {
        if (table.find(s) != table.end()) {
            return table.find(s)->second;
        } else {
            return table.find("xx")->second;
        }
    }
};


int
main()
{

   MarketLangMap *m = new MarketLangMap();
   const char* r = "us";
   char* p = new char(10);
   strcpy(p, "us");
   std::cout<<(*m)["us"]->lang <<std::endl;``
   std::cout<<(*m)[r]->lang <<std::endl;
   std::cout<<(*m)[p]->lang <<std::endl;

}

期待される出力: すべて すべて すべて

ここにコードを入力してください

実際の出力: all all na

4

1 に答える 1

4

std::mapは、デフォルトで に設定されている内部比較オブジェクトによって示される厳密な弱い順序付け基準を使用していstd::lessます。

std::lessは引数を文字列として扱わずchar*、単にポインタとして認識し、一方のポインタが他方よりも小さいかどうかをチェックします。

ただし、引数を比較するための新しいクラスを作成し、それらを文字列として扱うことはできます (ただし、 std::stringC と C++ の混合を避けるために使用する必要があると思います)。char*

#include <cstring>

struct ConstCharStarComparator
{
  bool operator()(const char *s1, const char *s2) const
  {
    return strcmp(s1, s2) < 0;
  }
};

map<const char*, MarketLang *, ConstCharStarComparator> table;
于 2013-05-01T01:21:59.660 に答える