将键值插入到错误的键中

map inserting key values into wrong key?

本文关键字:错误 键值 插入      更新时间:2023-10-16

我一直有这个问题一段时间与我的代码,寻找我的错误,我看不到它。我有一个映射,映射我将关键字映射到值。
我的问题是,有时当插入关键字= "蓝色"的值插入到键为"红色"。
所以不用
键:红色,值: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);
}  

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

这段代码还有许多其他问题,其中一些在其他答案和注释中提到。

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

最可能的问题是,您还没有定义您的key type的排序函数,您的地图有。你需要"告诉"map 如何排序索引类型

例如:

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;