c ++更改地图中关键对象的对象属性?

c++ change object properties of object that is key in map?

假设我有以下 classes:

#include <string>

class Item {
public: 
   Item(std::string name, int id);
   virtual int getWeight() = 0;

protected:
   std::string name;
   const int id;
}
#include <vector>
#include <memory>
#include "Item.h"

class Bucket : Item { 
public:
    Bucket(std::string name, std::string type, int id) // In the implementation this will call the Constructor of Item
    bool operator<(const Bucket& b) const {
        return (id < b.id );
    }
    void addItem(std::shared_ptr<Item> itemm) {
      this->weight += item->getWeight();
      this->items.push_back(item);
    }
    int getWeight() override; //this implementation does not matter to the problem

private:
    std::string type;
    std::vector<std::shared_ptr<Item>> items;
    int weight = 0;

}

还有其他 class 继承自 class 项目,但为了方便起见,我只显示 class 存储桶。

现在,在我的主要方法中,我想遍历一个已经包含一些条目的映射,并调用一个方法来更改一个 属性 键对象。 main.cpp:

#include <map>
#include <memory>
#include <vector>
#include "Item.h"
#include "Bucket.h"

using namespace std;

int main(){
   map<Bucket, vector<shared_ptr<Item>>> map; // Imagine this map has some entries
   for(auto itr = map.begin(); itr != map.end(); itr++){
        for_each(itr->second.begin(), itr->second.begin(), [&itr](shared_ptr<Item> item){
            itr->first.addItem(item); // This does not compile, the error will be in the text below
        });

}

如代码中所述,它不会编译并在第 itr->first.addItem(item); 行出现以下错误: 'this' argument to member function 'addItem' has type 'const Bucket', but function is not marked const.

我无法使该方法成为 const,因为它正在更改对象的某些 属性,我会在那里遇到错误。 我不确定我是否正确理解了这个错误,但我认为问题在于,当我将一个 Bucket 放入 map 中时(Bucket 是 key),它变成了 const。 如果是这种情况,有没有办法告诉编译器只使用 Bucket 的 id 属性 作为映射的常量键(而不将映射更改为 map<int, <pair<Bucket,vector<shared_ptr<Item>>>>> )?还是我没有理解这里的主要问题?

I think the problem is, that as I put a Bucket into a map (Bucket is the key), it becomes const

正确。地图应该是有序的,如果你能改变一个键,你就可以打破这个不变量。这样做可能会破坏所有后续搜索或可怕地插入。

链接的 有效,但很难看。除非 map-key-ness 是您的 Bucket 的核心功能(我无法从示例代码中判断这是否可能),否则它的一些成员 mutable 感觉像是 hack。

你的整个设计看起来很奇怪,老实说 - 你最终会得到一个充满 Bucket 键的映射,这些键复制键值对后半部分的信息。您是打算之后将这些 Buckets 移动到其他地方,还是它们将永远受制于冗余引用的残留向量?

如果该地图是建立连接的中间步骤,那么它不应该是 Bucket 对象所在的位置。也许您应该有一个主要查找 map<id, Item>,另一个瞬态映射 multimap<id, id> 描述哪个项目包含哪些其他项目。