我有一个类,比如说Person,它是由另一个类/模块管理的,比如说PersonPool。

我的应用程序中还有另一个模块,例如模块M,它希望以最有效的方式将信息与人相关联。我考虑了以下替代方案:

  • 向Person中添加一个数据成员,该成员可被应用程序的另一部分访问。优点是,这可能是最快的方法。缺点是,这是侵入性的。 Person不需要了解有关此额外数据的任何信息,并且如果我想将此数据成员与其他模块隔离开,则需要将其设为私有(private)并将模块M设为我不喜欢的 friend 。
  • 向Person中添加一个“通用”属性包,其他模块可以在其中添加其他属性。优点是它是非侵入性的(除了带有属性袋),而且很容易通过其他模块添加“属性”。缺点是它比直接从Person处获取值(value)要慢得多。
  • 在模块M中使用map / hashmap,该映射将Person(指针,id)映射到我们要存储的值。就数据分离而言,这似乎是最好的解决方案,但又慢得多。
  • 给每个人一个唯一的数字,并确保在历史记录中没有两个人得到相同的数字(我什至不想让这些人重复使用数字,因为那样的话,老年人的数据可能会与数据混淆一个新人)。然后,外部模块可以简单地使用 vector 将个人的唯一号码映射到特定数据。优点是,我们不需要使用不需要知道的数据(除了他独特的nubmer之外)来入侵Person类,并且我们有一种快速的方法来从 vector 中获取模块M的数据。缺点是,如果删除并创建许多人, vector 可能会变得很大(因为我们不想重复使用唯一编号)。

  • 在最后一个替代方案中,可以通过使用稀疏 vector 来解决该问题,但是我不知道稀疏 vector 的实现是否非常有效(比map / hashmap更快)。

    还有其他方法可以做到这一点吗?
    还是有一种有效的稀疏 vector 可以解决最后一种选择的内存问题?

    最佳答案

    第一种和第三种是合理的通用技术。第二个是动态编程语言(例如Python和Javascript)如何实现对象的成员数据,因此不要以不可思议的慢速将其释放。第四点与关系数据库的工作原理相同。使关系数据库像拍板一样运行是可能的,但是很困难。

    简而言之,您已经描述了4种广泛使用的技术。排除其中任何一种的唯一方法是针对您问题的详细信息(所需的性能,人员数,属性数,代码中要执行此操作的模块数等)以及相应的度量。

    模块M的另一种可能性是定义一个从Person继承的类,并添加额外的数据成员。这里的原理是M的人的观念与Person的人的观念不同,因此将M的观念描述为一个类。当然,仅当在同一Person对象上运行的所有其他模块都通过多态性来这样做时,这才起作用,此外,如果可以使M负责创建对象(也许通过工厂的依赖注入(inject)),那么这才起作用。这是一个很大的“如果”。甚至更大的一个,如果除了M之外不需要对对象进行任何生命周期的操作,那么您可能可以使用组合或私有(private)继承优先于公共(public)继承。但是,如果模块N要创建人员集合,然后模块M想要向他们附加额外的数据,则没有任何用处。

    关于c++ - 向实例添加数据的最有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2396106/

    10-10 00:44
    查看更多