0

我有一个带有整数和我制作的类的地图。现在我需要更改列表中每个元素的整数。

我是这样想的:

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从每个元素的整数中减去。

4

3 回答 3

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);
}
于 2013-06-16T12:45:01.063 回答
1

你不能那样做。您正在尝试修改地图中元素的键。密钥解锁值,因此值由密钥解锁。如何使用不同的密钥解锁相同的值?

您正在使用地图,因为很容易通过键获取值。但是您试图将键用作索引,这是不可能的,这是一种不同的数据结构。

我认为您应该为元素使用矢量,或为您的键使用矢量,或地图的临时副本。如果您向我提供有关您为什么要这样做的更多信息,那么也许我也可以更具体地说明解决方案。

于 2013-06-16T13:14:51.370 回答
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;
}
于 2013-06-16T12:41:50.453 回答