c++ - 对象和子类的高效容器
问题描述
我需要的
我需要一个存储对象实例A
和派生子类的容器B
。具体来说,我需要实现以下任务:
- 有效添加新实例(追加就足够了)。
- 高效移除容器中随机位置的实例(不需要按索引查找;对象的移除将在迭代容器时发生)。
- 对容器中的元素进行有效迭代。这是最重要的部分,因为迭代比操作更频繁。
例子
头文件可能如下所示:
int globalB = 5;
// Base class
class A {
public:
A(a) : a(a);
~A();
int a;
virtual int get_b() {
return globalB;
}
};
// Derived class
class B : public A {
public:
B(a, b) : A(a), b(b);
~B();
int a;
int b;
int get_b() {
return b;
}
};
// Container
class Container {
public:
Container();
~Container();
// adds an A element
void add_element(a);
// adds a B element
void add_element(a, b);
// removes all elements with (elem.a == 0)
void remove_a0_elements();
// Iterator (I will still have to figure out how this is done properly)
struct Iterator { /* ... */ };
};
static int example_usage() {
auto container = Container();
for (int a=1; i<=100; i++) {
container.add_element(a);
container.add_element(a, a);
}
int sum = 0;
for (auto &elem : container) {
sum += elem.get_b();
}
return sum;
}
请注意,与示例所建议的不同,元素不会在连续操作中添加,而是在程序中随机添加。当然,我用来完成示例中任务的容器的任何结构也都很好(例如,通过移交它而不是就地构建它来添加一个元素)。如果有一些内存开销,那将不是主要问题,因为所有对象加起来都不是很大。
到目前为止我的想法
我已经考虑过使用一个向量std::unique_ptr
来完成任务,正如这里所建议的那样。但是,我担心内存会以这种方式分散,从而大大降低迭代的性能(参见此处)。另一个想法是让Container
包装两个向量 -A
和B
,分别 - 但是我不知道如何构建迭代器。此外,这将使使用更多子类变得困难(我需要它至少适用于两对基类和子类)。
问题
- 有没有可以做我需要的标准容器?
- 如果不是,那么根据需要实现容器的优雅方式是什么?
- 有没有办法“保留”一块内存来构造
Container
in 的元素而不知道它们的大小?然后我可以包装一个指针向量并规避分散内存的问题。
解决方案
推荐阅读
- google-chrome - 如何安全地存储 Chrome 扩展程序数据?
- apache-kafka - 无法在 kafka 中列出经纪人 ID
- r - 从R中的列名中间删除部分
- python - 查找与另一个字典中的键、值对匹配的字典的 Pythonic 方法
- javascript - 当我使用 .innerText 时未定义但当我不使用时则不是
- javascript - 如何延迟加载图像?
- c# - 分块上传视频 Azure blob 存储
- tensorflow - 词向量的中心
- javascript - Vue 数据在 setInterval() 方法中更新,但 dom/view 不更新
- datetime - Java 8 Vavr onFailure 连接