考虑一个代码,其中有一个国家列表,其中包含一个城市列表,其中一个城市列表包含一个街道列表。给定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的所有CityCountry 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/

10-14 01:52