使用大型数据集初始化类成员向量的最有效方法

Most efficient way to initialize class member vector with large data set

本文关键字:向量 有效 方法 成员 大型 数据集 初始化      更新时间:2023-10-16

使用类中的std::vector成员变量的数据初始化的最快/内存效率方法是什么?

这是我能够想到的:

class LargeClass
{
//lot of data, with long running constructor to initialize them 
}
class EngineClass
{
public:
EngineClass( const vector<LargeClass>& vectorOfLargeClass )
{
mVectorOfLargeClass = vectorOfLargeClass; //Here is what I was able to come up
}
private:
vector<LargeClass> mVectorOfLargeClass;
}
int main()
{
vector<LargeClass> vectorOfLargeClass;
...
//fill vectorOfLargeClass with a lot of data
...
EngineClass engine( vectorOfLargeClass );
...
}

我需要EngineClass保存main()中创建的vectorOfLargeClass向量的数据副本。

我使用C++11,但我并不完全熟悉该语言,也许有更好更标准的方式来完成此类任务。

添加移动构造函数:

EngineClass( vector<LargeClass>&& vectorOfLargeClass ) :
    mVectorOfLargeClass(std::move(vectorOfLargeClass))
{
}

然后按如下方式使用它:

EngineClass engine( std::move(vectorOfLargeClass) );

但这假设vectorOfLargeClassstd::move之后不再需要main

你可以

这样做:

class EngineClass
{
public:
    EngineClass(vector<LargeClass> vectorOfLargeClass) :
        mVectorOfLargeClass(std::move(vectorOfLargeClass) {}
private:
    vector<LargeClass> mVectorOfLargeClass;
};

因此,您可以移动或复制矢量:

EngineClass engine( vectorOfLargeClass ); // copy
EngineClass engine(std::move(vectorOfLargeClass)); // move

一种稍微快一点的方法是使用构造函数的初始值设定项列表来初始化成员变量:

EngineClass( const vector<LargeClass>& vectorOfLargeClass )
: mVectorOfLargeClass(vectorOfLargeClass)
{
}

通常,更喜欢在构造函数的初始值设定项列表中初始化成员变量。

如果您不想复制输入向量,而是在成员向量中传输其元素std::vector::swap您可以使用超快的成员函数,因为它等效于指针交换,在向量之间交换缓冲区:

EngineClass( vector<LargeClass>& vectorOfLargeClass )
{
  mVectorOfLargeClass.swap(vectorOfLargeClass);
}