地图的查找功能得到错误的结果
Getting wrong result for FIND function of map
该方法无法找到传递给它的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;
}
}
您需要使用自己的自定义比较器来比较指针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 ;
这是因为在为相等进行比较时,地图使用 <
.
当映射的Key
char*
时,您正在比较指针(而不是 C 字符串)。因此,您正在测试一个指针是否小于另一个指针(即比较地址)。
当映射的Key
std::string
时,您可以使用为 std::string
定义的operator<
,它实际上比较字符串中的字符以确定哪个字符小于另一个字符。
由于 std::map 是一个模板,它实际上需要更多的参数来定义它的工作原理。第三个参数是比较函数(默认为通常operator<
的较小std::less<K>
)。
因此,您可以使用 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;
使用 char * 时,它只是比较地址。
char a[] = "hi";
char b[] = "hi";
char *c = a;
char *d = b;
C&D是不同的。(c != d)如果要比较字符串,则应使用 strcmp。
但是当使用字符串时,它会覆盖"=="操作。所以你可以用"=="进行比较
string a = "hi";
string b = "hi";
A和B是相同的。(a == b)
您有此行为是因为您使用指向字符串文本的指针,每次创建此类指针时,指针都不同。因此,例如,您创建 2 个指针:
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)
只需将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;
}
- 如何修复循环中的错误产生的错误结果?
- 添加可变参数函数的错误结果
- 使用特征 3 线性系统求解器的错误结果
- 按位包含 OR 的错误结果
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- STD :: FPCLASSIFY的错误结果使用Valgrind进行长时间的双重双重结果
- 视觉工作室的错误结果
- 将C#struct传递给C 不受管理的DLL返回错误结果
- 最长的常见子字错误结果
- 华氏度到摄氏度的错误结果
- UE4中简单坐标变换的错误结果
- 记忆错误结果的说明[编译器行为]
- 如何解决错误PRJ0002:错误结果 -1073741515从"cl.exe"返回?
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- glGetUniformLocation OpenGL ES 2.0(在ipad 3 iOS 7.0.3上返回错误结果)
- 在模板函数中调用std::for_each时出现错误结果
- 使用copy和back_inserter将矢量附加到其自身时出现错误结果
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 来自 c++ 代码的错误结果
- 使用浮点值和铸造的算术运算的错误结果 - 差异很大,我想这不是准确值的情况(429497)?