gpt4 book ai didi

c++ - 如何在不丢失 OOP 的情况下让对象在内存中连续?

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:22 25 4
gpt4 key购买 nike

考虑一个代码,其中我们有一个国家列表,其中包含一个城市列表,其中包含一个街道列表。给定 Country 中的每个 City 包含完全相同数量的 Street (nbStreetsPerCity) 和此数量的街道per City 随着时间的推移保持不变。

class Street
{

};

class City
{
// Attribute
std::vector<Street> Streets;

// getter
Street& getStreet(int street_index) {return Streets[street_index];}
// More stuff

};

class Country
{
// Attribute
std::vector<City> Cities;

// getter
City& getCity(int city_index) {return Cities[city_index];}

// More stuff

};

我必须遍历每个 Street,当我有很多 Street 和很少的 City 时,这个过程非常快,但是相当当我有很多 Cityies 而很少有 Street

时会变慢

使用这样的代码,给定 Country 的所有 CityStreet 在内存中是不连续的。出于性能原因,我想尝试一个代码,让给定 Country 的所有 Street 在内存中都是连续的。我想不出一种方法让所有 Street 在内存中都是连续的而不破坏面向对象编程的一部分。

class Street
{

};


class Country
{
// Attribute
std::vector<Street> Streets;
int nbStreetsPerCity;

// getter
City getStreet(int city_index, int street_index)
{
Streets[city_index*nbStreetsPerCity + street_index]
};

// More stuff

};

使用这样的代码,给定国家的所有 Street 在内存中都是连续的,但是,我丢失了 City 对象,因此失去了 OOP 的优势。

有没有办法让所有街道在内存中都是连续的,同时又不失去 OOP 的优势?

非常欢迎一个非常简单的例子!

最佳答案

执行此操作的方法是使用包含街道 vector 的“StreetManager”。然后,您的城市和国家/地区将包含对您的街道管理员持有的街道的引用。

当我说“引用”时,这些可能只是索引或一些 ID 或任何其他允许根据您的读/写要求进行查找的内容。
关于读/写要求,我指的是引用可能会在 vector 编辑时被破坏,索引会在 vector 移除时被破坏,而 id 将需要一个 id -> 由管理器维护的索引的映射。

您所在城市/国家/地区的“getStreets”函数只需将索引/ID 交给管理器并返回结果即可。

要牢记的重要一点是,尝试在管理器中编辑街道数将导致所有引用被破坏。

关于c++ - 如何在不丢失 OOP 的情况下让对象在内存中连续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47637933/

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