映射将键值插入错误的键?

时间:2011-08-14 08:09:30

标签: c++ map

我的代码一直遇到这个问题,找我的错误,我看不到它。我有一张地图,地图我将关键字映射到值 我的问题是有时当插入keyword =“Blue”时,该值将插入到“Red”键中 因此,而不是, 键:红色,值: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);
}  

2 个答案:

答案 0 :(得分:0)

最有可能的问题是,您没有为地图所具有的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;

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

答案 1 :(得分:0)

我看不到keywordObject的声明,所以我认为它是一个全球性的。将新对象添加到已存在的关键字的情况在else中处理。在这种情况下keywordObject的价值是多少?是谁设定的?

此代码还存在许多其他问题,其他问题在其他答案和评论中提及。

  • 缺少addKeywordsForObject
  • 的返回类型
  • 可能使用char*作为需要特殊处理的地图密钥(不清楚,因为您没有显示StringToObjectSetMap的声明)
  • 一个函数,它通过使用省略号获取可变数量的参数(在C ++中几乎从来不是一个好主意)
  • 使用局部变量适当的全局变量