C ++如何更改map元素的值

时间:2013-06-16 12:38:34

标签: c++ map

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

我想的是这样的:

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

3 个答案:

答案 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;
}