我的程序中有一张地图,用于存储产品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));
}
非常感谢!
答案 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;
}