为什么我的键被覆盖时,插入一个对象到映射
Why are my keys being overwritten when inserting an object into a map?
我遇到了这样一个问题:在向映射中插入元素时,我假设每次向其中放入新对象时,前一个对象都会被覆盖。每当我去打印地图的内容时,只打印最近添加的项目。我有两个类,一个是Recipe类,一个是Ingredient类。我的食谱有一个map<Ingredient*, int>
,它包含一个对象和它的数量。
Recipe::Recipe(){
title = "";
ingredients;
}
void Recipe::insertIngredient(Ingredient* item, int quantity){
ingredients.insert( make_pair( item, quantity ) );
}
Ingredient::Ingredient(){
name = "";
unit = "";
}
对于用于初始化变量和打印内容的每个类,我都有getter和setter,但是每当我打印Recipe的映射的内容时,只打印我放入其中的最后一项。下面是我在主函数中打印地图的代码。
map<Ingredient*, int> tempIngredients = tempRecipe->getIngredients();
map<Ingredient*, int>::iterator ingredientIt;
for (ingredientIt = tempIngredients.begin(); ingredientIt!= tempIngredients.end(); ingredientIt++) {
Ingredient* tempIngredient = ingredientIt->first;
int quantity = ingredientIt->second;
cout << "n" << tempIngredient->getName() << " " << tempIngredient->getUnit() << " " << quantity << flush;
}
目前我的输出如下:
未漂白小麦混合粉C. 1
是我添加的最后一个元素的成分名称、单位和数量(来自映射的值)。
使用指针作为映射键,而没有实现比较操作符。
您最好使用Ingredient
对象并实现operator<
。
class Ingredient {
public:
bool operator<(const Ingredient & b) const {
return getName() < b.getName();
}
// Rest of class methods data etc...
};
std::map<Ingredient, int> ingredients;
你怎么呼叫insertIngredient
?由于您的映射是由Ingredient*
键控制的,因此每个条目必须是唯一的Ingredient
对象(通过新建或离开堆栈),否则键将冲突。
真正的问题是你为什么要在指针上按键?根据@GWW的回答,一个更好的解决方案是存储Ingredient
值并为它们创建一个自定义比较器函数。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 在C++的链表末尾插入一个节点
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 多次生成一个插入的对象
- 如何检查对象属性更新是否存在 std::map 键,否则插入一个新键?
- 使用继承c++在vector中插入一个模板对象
- 为什么我的键被覆盖时,插入一个对象到映射
- 在哈希表中插入一个struct对象