我正在对一些大量使用std::vector<foo>
的算法进行过早优化。我的一个优化涉及为某些情况子类化foo,这意味着vector<foo>
将同时包含foo
和foo_subclass
。
foo
只有char*
和int
,而foo_subclass
只有std::string
。我的理解是,这些中的每一个都会在向量中占据固定宽度的插槽(带有foo_subclass
字符串的指针),但是当它们混合时如何在容器中分配? / p>
答案 0 :(得分:3)
简短的回答是“你不能这样做”。 std::vector<foo>
无法包含foo_subclass
:如果您尝试将foo_subclass
放入vector
,则会对foo
的{{1}}组件进行切片,制作该副本,并将foo_subclass
放入foo
。
答案越长,有两种方法可以解决这个问题。
首先,您可以创建一个vector
- std::vector< std::unique_ptr<foo> >
拥有智能指针vector
。如果foo
为~foo
,这将非常愉快。您丢失了连续的数据。您必须了解virtual
,但无论如何都应该了解unique_ptr
。
其次,您可以创建unique_ptr
或同等产品。在这种情况下,最终存在足够的std::vector< boost::variant< foo, foo_subclass > >
或foo
存储空间,并且在访问点,用户必须确定它们是否正在获取其中一个。从理论上讲,您甚至可以编写自己的变体foo_subclass
,以便它知道存储的类型是相关的,您可以访问variant
,只访问foo
个实例。子类。
第一个是更容易,第二个是更先进的技术,可能不值得你打扰。