将对象插入地图时为什么要覆盖我的键?

时间:2014-07-18 18:40:48

标签: c++ object 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

我添加的最后一个元素的名称,单位和数量(地图中的值)是什么。

2 个答案:

答案 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值并为它们创建自定义比较器函数。