该方法无法找到传递给它的char *数组,即使它存在于map中。 当我在地图中用std :: string替换char *时。代码工作正常。
static void CreateTranslationMap();
static UString FindTranslatedString(char* propertyName);
static std::map<char*,UString> TranslationMap ;
static void CreateTranslationMap()
{
UString engString("TextAlignmentPosition");
char* transString= MSGTXT("TextAlignmentPosition");
TranslationMap.insert(std::pair<char*,UString>(transString,engString));
}
UString FindTranslatedString(char* propertyName)
{
UString NotFound("CannotFind");
std::map<char*, UString>::iterator itr;
itr = TranslationMap.begin();
itr = TranslationMap.find(propertyName);
if(itr!= TranslationMap.end())
{
return itr->second;
}
else if(itr== TranslationMap.end())
{
return NotFound;
}
}
答案 0 :(得分:3)
您需要使用自己的自定义比较器来比较指向char
使用:
struct cmp_c_string
{
bool operator()(char const *lhs, char const *rhs) const
{
return std::strcmp(lhs, rhs) < 0;
}
};
std::map<char*,UString, cmp_c_string > TranslationMap ;
答案 1 :(得分:1)
那是因为在进行相等性比较时,地图使用<
。
当地图的Key
为char*
时,您正在对指针进行比较(而不是C-String)。所以你正在测试一个指针是否小于另一个指针(即比较地址)。
当地图的Key
为std::string
时,您使用为operator<
定义的std::string
,它实际上比较了字符串中的字符,以确定哪个更少比另一个。
由于std :: map是一个模板,它实际上需要更多参数来定义它的工作原理。第三个参数是比较函数(默认为std::less<K>
,通常为operator<
)。
所以你可以使用char *你只需要一个自定义比较器操作符。
bool comparitor(char const* lhs, char const* rhs)
{
return (test for less than or some other strict weak function);
}
std::map<char*, UString, comparitor> myMap;
答案 2 :(得分:0)
您有这种行为,因为您使用指向字符串文字的指针,每次创建这样的指针时它都是不同的。因此,例如,您创建了两个指针:
char* p1 = "Hello world!";
char* p2 = "Hello world!";
虽然p1和p2指向的内容是相同的,但指针本身是不同的。所以p1 != p2
,你试图将指针存储在地图中。您应该使用std :: string,或者使用遍布各处的全局常量指针;类似的东西:
const char* const c_transString = MSGTXT("TextAlignmentPosition");
...
TranslationMap.insert(std::pair<char*,UString>(c_transString, engString));
...
FindTranslatedString(c_transString)
答案 3 :(得分:0)
使用char *时,它只是比较地址。
char a[] = "hi";
char b[] = "hi";
char *c = a;
char *d = b;
c&amp; d是不同的。(c!= d)如果你想比较字符串,你应该使用strcmp。
但是当使用字符串时,它会覆盖“==”操作。 所以你可以使用“==”
进行比较string a = "hi";
string b = "hi";
a&amp; b是一样的。 (a == b)
答案 4 :(得分:0)
只需将char *替换为const char *,因为map数据类型始终采用const形式的字符串。我举了你的例子,它在我的终端上运行。所以新代码是:
#include<iostream>
using namespace std;
static void CreateTranslationMap();
static string FindTranslatedString(const char* propertyName);
static std::map<const char*,string> TranslationMap ;
static void CreateTranslationMap()
{
string engString("TextAlignmentPosition");
const char* transString= ("1");
TranslationMap.insert(std::pair<const char*,string>(transString,engString));
}
string FindTranslatedString(const char* propertyName)
{
string NotFound("CannotFind");
std::map<const char*, string>::iterator itr;
itr = TranslationMap.begin();
itr = TranslationMap.find(propertyName);
if(itr!= TranslationMap.end())
{
return itr->second;
}
else if(itr== TranslationMap.end())
{
return NotFound;
}
}
int main()
{
CreateTranslationMap();
string s =FindTranslatedString("1");
cout<<s<<endl;
return 0;
}