我有一个带有整数和我制作的类的地图。现在我需要更改列表中每个元素的整数。
我想的是这样的:
std::map<int, Product> ProductList; //This is filled somewhere and can be accessed in my function
void remove()
{
std::map<int, Product>::iterator it = ProductList.begin();
for(; it != ProductList.end(); it++)
{
it->first = it->first - 1;
}
}
现在我的编译器说
错误:指定只读成员“
std::pair<const int, Product>::first
”
我做错了什么?我需要从每个元素的整数中减去1
。
答案 0 :(得分:2)
你不能像那样修改地图的键;地图必须在内部对元素进行重新排序,因此您应该创建一个新地图并将其与旧地图交换。
void remove()
{
typedef std::map<int, Product> ProductMap;
ProductMap shifted;
ProductMap::const_iterator it = ProductList.begin();
ProductMap::const_iterator end = ProductList.end();
for(; it != end; ++it)
shifted.insert(std::pair<int, Product>(it->first - 1, it->second));
ProductList.swap(shifted);
}
答案 1 :(得分:1)
你做不到。您正在尝试修改地图中元素的键。键解锁该值,因此该键由键解锁。如何用不同的密钥解锁相同的值?
您正在使用地图,因为很容易通过密钥获取值。但是你试图使用密钥作为索引,这是不可能的,这是一个不同的数据结构。
我认为你应该为你的元素使用矢量,或者为你的键使用矢量,或者使用地图的临时副本。如果你给我更多关于你为什么要这样做的信息,那么也许我可以更具体地解决这个问题。
答案 2 :(得分:0)
您需要在地图中插入一个新对,并删除旧对。最好只创建一张新地图:
std::map<int,Product> oldProductList;
std::map<int,Product> newProductList;
std::map<product,int>::iterator it = iksProductList.begin();
for(; it != ProductList.end(); it++)
{
newProductList[it->first - 1] = it->second;
}