const char *在map find中找不到

时间:2013-04-30 23:28:54

标签: c++ string map char const

我有一个小程序,我试图在地图中搜索一个特定的字符串,如果我传递静态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;

}

预期产量: 所有 所有 所有

在这里输入代码

实际输出: 所有 所有 娜

1 个答案:

答案 0 :(得分:3)

std::map正在使用由其内部比较对象指示的严格弱排序标准,该标准默认为std::less

std::less不会将char*参数视为字符串,它只会将它们视为指针,而只检查一个指针是否小于另一个指针。

但是,您可以(但我想您应该使用std::string来避免混合C和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;