将元素添加到c ++映射中

时间:2014-02-14 15:04:18

标签: c++

我的程序中有一张地图,用于存储产品p的代码及其数量。

如果要求新请求,并且产品已经存在于地图中,我只需要将该对中的第二个元素(代码,数量)与地图中的元素相加。

我该怎么做?

void Request :: addItem (Product p, double amount) {
    if(this->isItemRequest(p)) {
        //p already exists in the map.
    }

    this->rdata.insert(pair<int, double>((int)p.getCode(), amount));
}

非常感谢!

4 个答案:

答案 0 :(得分:3)

假设您的地图在Request类中声明为std::map<int, double> rdata,则代码可以是:

void Request::addItem( Product p, double amount )
{
    if ( this->isItemRequest(p) )
    {
        int Code = int(p.getCode);
        this->rdata[ Code ] += amount;
    }

    this->rdata.insert( pair<int, double>(int(p.getCode), amount) );
}

但是,如果isItemRequest()只是一个简单的检查,您的代码可以简化为:

void Request::addItem( Product p, double amount )
{
    int Code = int(p.getCode);
    this->rdata[ Code ] += amount;
}

P.S。也许,这是一个好主意(如果你可以改变界面)通过const引用传递Product

答案 1 :(得分:1)

最简单的方法是

rdata[p.getCode()] += amount;

如果它尚未在地图中,则[]将插入值为零的元素,因此该值最终将为amount。如果是,则将amount添加到现有值。

答案 2 :(得分:1)

如果您致电:

this->rdata[key] = value;

使用默认构造函数创建一个值(int()初始化为0),返回对它的引用,并在其上调用operator=。您可以通过先检查密钥是否存在来避免这种情况:

this->rdata.count(key) != 0

或更简单

this->rdata.count(key)

如果它存在,你可以在operator[]返回的引用上使用operatror =,operator + =等等:

if (this->rdata.count(key) == 0)
    this->rdata.insert( pair<int, double>( key, value ) );
else
    this->rdata[key] += value;

但在这个简单的情况下

this->rdata[key] += value;

应该这样做。

答案 3 :(得分:0)

简单:map.find:)

#include <iostream>
#include <map>
#include <string>

typedef std::map<std::string, int> StringIntMap;

int main() {
    StringIntMap map;
    map["coke"] = 10;
map["fries"] = 25;
    map["pizza"] = 50;
std::cout << "Before increase" << std::endl;
StringIntMap::const_iterator it;
for (it = map.begin(); it != map.end(); it++) {
    std::cout << it->first << ": " << it->second << std::endl;
}
std::cout << "Now, increase pizza +50" << std::endl;
StringIntMap::iterator item = map.find("pizza");
if (item != map.end()) {
    // pizza exists increase 50
    item->second += 50;
} else {
    std::cout << "Sorry, no pizza here" << std::endl;
}
std::cout << "after increase" << std::endl;
for (it = map.begin(); it != map.end(); it++) {
    std::cout << it->first << ": " << it->second << std::endl;
}
return 0;

}