2

该方法无法找到传递给它的 char* 数组,即使它存在于 map 中。当我在地图中将 char* 替换为 std::string 时。代码工作正常。

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;
    }

}
4

5 回答 5

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 ;
于 2013-10-18T06:47:30.297 回答
1

那是因为在进行相等性比较时,地图使用<.

当地Key图是char*您正在比较指针(而不是 C 字符串)时。因此,您正在测试一个指针是否小于另一个指针(即比较地址)。

当地Key图的 是std::string您使用operator<为 定义的 时std::string,它实际上比较字符串中的字符以确定哪个小于另一个。

由于 std::map 是一个模板,它实际上需要更多参数来定义它的工作方式。第三个参数是比较函数(默认为 less 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;
于 2013-10-18T06:47:02.097 回答
0

您有这种行为是因为您使用指向字符串文字的指针,每次创建这样的指针时都会有所不同。因此,例如,您创建 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)
于 2013-10-18T06:47:22.530 回答
0

使用 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)

于 2013-10-18T06:48:10.547 回答
0

只需将 char* 替换为 const char* ,因为地图数据类型始终采用 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;
  } 
于 2013-10-18T07:00:15.370 回答