首页 > 解决方案 > 对象和子类的高效容器

问题描述

我需要的

我需要一个存储对象实例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包装两个向量 -AB,分别 - 但是我不知道如何构建迭代器。此外,这将使使用更多子类变得困难(我需要它至少适用于两对基类和子类)。

问题

标签: c++iteratorcontainerssubclassstdvector

解决方案



推荐阅读