地图的FIND功能出错

时间:2013-10-18 06:39:07

标签: c++ visual-c++ map stl

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

}

5 个答案:

答案 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)

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

当地图的Keychar*时,您正在对指针进行比较(而不是C-String)。所以你正在测试一个指针是否小于另一个指针(即比较地址)。

当地图的Keystd::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;
  }