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

问题描述 投票:0回答:1

我需要使用动态实例化的对象填充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做很多新的和很多的调用。我以下面的解决方案结束,将执行时间除以原因2:

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将它们全部放入。一个开销是创建指针数组,以便能够在对象上插入指针而不是将对象复制到向量中。另一个是需要在之后手动构造对象。

我愿意接受更好的解决方案,包括使用除矢量之外的其他结构。谢谢!

c++
1个回答
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));
}
© www.soinside.com 2019 - 2024. All rights reserved.