gpt4 book ai didi

c++ - 相互了解的对象集合

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:20 27 4
gpt4 key购买 nike

这是一个宽泛的问题,但根据我自己的理解,我决定将其抛出。

谁能推荐设计,甚至是普遍接受的设计模式,以应对人们希望各种对象相互感知的情况?

用人/社区模拟做类比,当你有 X 人对象,其中 X 可以动态增长/收缩,并且每个人对象都持有对另一个人的意见或关系时,最好应用什么模式对象?

在编程语法之外思考,我可以只用一个 X 乘 X 的网格来表示每个人彼此之间的关系(喜欢、不喜欢、没见过面等)。我想基本上在代码中将其实现为与每次创建新对象时都会更新的每个人对象分开的对象,但这似乎是一个完全不优雅的解决方案。这里有人有什么建议吗?

其次,如果我有一组人,每个人都有“库存”或他们携带的元素,我想我可以创建每个人的库存作为类(class)的列表成员;这个链表会随着这个人的对象的增长和收缩而增长和收缩。

可以很容易地查询 people 对象中携带的对象,但我想不出一种有效的方法来使反之亦然;也就是说,我希望能够查询一个项目并找到哪些人拥有该项目。

我确实读过这个问答: Game Objects Talking To Each Other..但我不确定它是否完全适用于我的情况。

有人可以提供任何建议吗?

谢谢!

--R

最佳答案

您正在寻找的是一个相对简单的关联。

class Person {
struct Relationship {
// whatever
};
std::map<Person*, Relationship> relationships;
public:
Person() {}
void Meet(Person* other) {
// think about it
relationships[other] = ...;
}
~Person() {
// Loop through the map and ensure no dud relationships
for(auto& pair : relationships) {
pair.first->relationships.erase(this);
}
}
};

至于确定拥有某些元素的人,我认为(相对)简单的管理器解决方案应该可以很好地工作,尽管我讨厌将类称为“管理器”。

class PersonManager {
struct Item { ... };
std::set<Item, std::set<Person*>> items; // set for no dupes
public:
void AddToInventory(Item i, Person* p) {
items[i].insert(p);
}
std::vector<Person*> PeopleWithItem(Item i) {
return std::vector<Person*>(items[i].begin(), items[i].end());
}
};

如果您必须以这种方式对大量关系建模,我建议您使用数据库。但是,我怀疑任何数据库都可以与此代码的效率相媲美 - 您甚至可以转到哈希容器并为大多数这些操作获得 O(1)。

关于c++ - 相互了解的对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7143976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com