我需要使用动态实例化的对象填充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将它们全部放入。一个开销是创建指针数组,以便能够在对象上插入指针而不是将对象复制到向量中。另一个是需要在之后手动构造对象。
我愿意接受更好的解决方案,包括使用除矢量之外的其他结构。谢谢!
一个简单的建议是将对象存储在向量中,而不是指针,并使用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));
}