地图的查找功能得到错误的结果

Getting wrong result for FIND function of map

本文关键字:错误 结果 功能 查找 地图      更新时间:2023-10-16

该方法无法找到传递给它的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;
  }