用动态实例化的对象填充矢量的快速方法

时间:2018-10-10 10:42:20

标签: c++

我需要用动态实例化的对象填充std :: vector。

class MyClass {
    std::vector<MyObject*> m_objects;
    //...
}

这是我需要朴素代码的用例:

void MyClass::MyFunc1(std::vector<MyType> data)
{
    for (auto&& d : data)
        m_objects.push_back(new MyObject(d));
}

因此,我在参数中采用n个数据元素组成的数组,并使用这些数据元素构造n个对象。我将所有元素都放在向量中。

我想找到一种快速的方法来实现它,主要是避免避免对push_back进行很多新的调用。我以以下解决方案结束,将执行时间除以二:

void MyClass::MyFunc2(std::vector<MyType> data)
{
    size_t size = data.size();
    MyObject *array = new MyObject[size];
    MyObject **parray = new MyObject*[size];
    for (int i = 0; i < size; i++)
        parray[i] = &array[i];

    m_objects.insert(m_objects.end(), &parray[0], &parray[size]);
    for (int i = 0; i < size; i++)
        m_objects[i]->data = data[i];
}

因此,我一次创建了所有对象,然后使用insert一次将它们全部放入。一种开销是创建指针数组,以便能够在对象上插入指针,而不是将对象复制到向量中。另一个是需要在以后手动构造对象。

我愿意寻求更好的解决方案,包括使用除载体之外的其他结构。谢谢!

1 个答案:

答案 0 :(得分:3)

一个简单的建议是将对象而不是指针存储在向量中,并使用reserve()来预分配空间:

std::vector<MyObject> m_objects;    

void MyFunc1(std::vector<MyType> data)
{
    m_objects.reserve(m_objects.size() + data.size());
    for (auto&& d : data)
        m_objects.emplace_back(d);
}

如果需要指针,请使用智能指针和reserve

std::vector<std::unique_ptr<MyObject>> m_objects;    

void MyFunc1(std::vector<MyType> data)
{
    m_objects.reserve(m_objects.size() + data.size());
    for (auto&& d : data)
        m_objects.push_back(std::make_unique<MyObject>(d));
}