我有一个小程序,我试图在地图中搜索一个特定的字符串,如果我传递静态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;
}
预期产量: 所有 所有 所有
在这里输入代码
实际输出: 所有 所有 娜
答案 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;