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>
描述哪个项目包含哪些其他项目。
假设我有以下 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
正确。地图应该是有序的,如果你能改变一个键,你就可以打破这个不变量。这样做可能会破坏所有后续搜索或可怕地插入。
链接的 Bucket
的核心功能(我无法从示例代码中判断这是否可能),否则它的一些成员 mutable
感觉像是 hack。
你的整个设计看起来很奇怪,老实说 - 你最终会得到一个充满 Bucket
键的映射,这些键复制键值对后半部分的信息。您是打算之后将这些 Buckets
移动到其他地方,还是它们将永远受制于冗余引用的残留向量?
如果该地图是建立连接的中间步骤,那么它不应该是 Bucket
对象所在的位置。也许您应该有一个主要查找 map<id, Item>
,另一个瞬态映射 multimap<id, id>
描述哪个项目包含哪些其他项目。