我遇到了在将元素插入地图时遇到的问题,我假设每次将新对象放入其中时,前一个都会被覆盖。每当我打印出地图的内容时,只会打印我添加的最新项目。我有两个类,一个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我添加的最后一个元素的名称,单位和数量(地图中的值)是什么。
答案 0 :(得分:0)
您正在使用地图键的指针而不实现比较运算符。
使用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;
答案 1 :(得分:0)
您是如何致电insertIngredient
的?由于您的地图由Ingredient*
键入,因此每个条目必须是唯一的Ingredient
对象(通过新的或不在堆栈中),否则密钥将发生冲突。
真正的问题是你为什么键入指针?根据@ GWW的回答,更好的解决方案是存储Ingredient
值并为它们创建自定义比较器函数。