将键值插入到错误的键中
map inserting key values into wrong key?
我一直有这个问题一段时间与我的代码,寻找我的错误,我看不到它。我有一个映射,映射我将关键字映射到值。
我的问题是,有时当插入关键字= "蓝色"的值插入到键为"红色"。
所以不用
键:红色,值: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;
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何使用 std::variant 打印地图键/值?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- C++ 映射的键/值的用户自定义名称?
- 试图(稍微)概括C++模板.关联容器键:值反转
- __int64 CString 返回错误的值 - C++ MFC
- srand() 输出了错误的值
- 更改多重映射容器中所有元素的键值
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- 插入新键时,它会更改现有键值的地址吗?
- 除法函数返回错误的值
- 在C++中共享键值对的最佳方式
- QScreen geometry()api为分辨率2736 x 1824和2560 x 1600提供了错误的值
- 使用无序映射在STL中存储键值对
- c++同一个键的多个键/值对
- 如何优化C++键值程序以获得更快的运行时间
- 错误的值是使用c++从CSV文件数据写入数组
- fscanf() 输出错误的值
- 将键值插入到错误的键中