考虑一个代码,其中有一个国家列表,其中包含一个城市列表,其中一个城市列表包含一个街道列表。给定City
中的每个Country
包含的Street
数(nbStreetsPerCity
)完全相同,并且每个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
ies时,过程非常快,但是当我有很多City
却又有很多Street
ies时,过程相当慢。使用这样的代码,给定
Street
的所有City
的Country
s在内存中并不连续。出于性能原因,我想尝试使给定Street
的所有Country
都在内存中连续的代码。我想不出一种方法来在不破坏部分面向对象编程的情况下将所有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的优势?
一个非常简单的例子将非常受欢迎!
最佳答案
为此,需要有一个“StreetManager”,其中包含您的街道 vector 。然后,您所在的城市和国家/地区包含对您的街道经理持有的街道的引用。
当我说“引用”时,这些可能只是索引或某些ID,或者是根据您的读/写要求允许查找的其他任何内容。
根据读/写要求,我指的是以下事实:在 vector 编辑中引用可能会被破坏,在 vector 移除时索引将被破坏,并且id将需要由管理者维护的id-> index映射。
然后,您所在的城市/国家/地区中的“getStreets”功能只需将索引/ id交给管理者并返回结果。
要记住的重要一点是,尝试在管理器中编辑“街道数”将导致所有引用均被破坏。
关于c++ - 如何使对象在内存中连续而不丢失OOP?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47637933/