【问题标题】:map inserting key values into wrong key?将键值映射到错误的键中?
【发布时间】:2011-08-14 08:09:29
【问题描述】:

我的代码一直有这个问题,寻找我看不到的错误。我有一张地图,地图我正在将关键字映射到值。
我的问题有时是在插入关键字 =“蓝色”时,值会插入“红色”的键中。
所以,而不是,
键:红色,值:obj1、obj2
键:蓝色,值:obj3、obj4
我明白了,
键:红色,值:obj1、obj2、obj4(obj4 应键入蓝色)
键:蓝色,值:obj3

不确定它是什么,因为相同版本的代码适用于我拥有的其他地图,它们只是没有那么多的键。

addKeywordsForObject(const Object* const object, int nKeywords, ...)
{
va_list     keywords;
char        *keyword;

va_start(keywords, nKeywords);
for (int i = 0; i < nKeywords; i++) {
    keyword = va_arg(keywords, char*);

    if(objectToKeywordMap.find(keyword) == objectToKeywordMap.end()) {  
        keywordObject = new ObjectSet();
        keywordObject->insert(const_cast<Object* const>(object));
        objectToKeywordMap.emplace(StringToObjectSetMap::value_type(keyword,keywordObject));
    }
    else {
        keywordObject->insert(const_cast<Object* const>(object));   
        objectToKeywordMap.emplace(StringToObjectSetMap::value_type(keyword,keywordObject));
    }
}
va_end(keywords);
}  

【问题讨论】:

  • 显示这些 char* 指针来自哪里,如何创建它们?看起来您不知道映射中的键是指针,而不是字符串,并且映射不会像字符串那样比较它们。
  • 您没有显示密钥是如何存储在地图中的。 std::stringchar* 之间会有很大的不同!一个常见的问题是比较指针而不是字符串值。
  • 我猜我漏掉了。键存储为字符串。地图是 map。在地图中使用之前,我曾尝试使用 tempString 将 char* 关键字存储为字符串,但没有效果。

标签: c++ map


【解决方案1】:

我没有看到keywordObject 的声明,所以我假设它是一个全局变量。在else 中处理了将新对象添加到已经存在的关键字的情况。在这种情况下,keywordObject 的值是多少?谁设置的?

此代码还有许多其他问题,其他答案和 cmets 中提到了一些问题。

  • 缺少addKeywordsForObject 的返回类型
  • 可能将char* 用作需要特殊处理的映射键(不清楚,因为您没有显示StringToObjectSetMap 的声明)
  • 一个使用省略号接受可变数量参数的函数(在 C++ 中几乎不是一个好主意)
  • 在适合使用局部变量的情况下使用全局变量

【讨论】:

  • 没有返回类型,它是一个 void 函数。 map 键是字符串,map 程序是 java 的一个端口,它使用 varargs 作为关键字,这就是为什么它采用可变参数
  • keywordObject 在标头 ObjectSet* keywordObject 中声明。看起来没有在else 中设置keywordObject 是问题所在。 keywordObject = objectToKeywordMap.find(keyword)-&gt;second;
  • @Phillip 您还需要为 void 函数设置返回类型。解决其他问题也是个好主意。
【解决方案2】:

问题很可能是您没有为您的地图所具有的key type 定义排序函数。您需要“告诉”地图如何对索引类型进行排序

例如:

struct sortKey{
bool operator()(key_type const& k1, key_type const& k2){
//define your sort criteria here
}

}
std::map<key_type,value_type,sortKey> the_map;

如果您认为还缺少其他内容,请发表评论。

【讨论】:

  • 我没有实现,但也许这是我应该做的事情。
  • 是的。否则你不知道地图将如何保留这些值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多