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

时间:2017-02-14 20:34:27

标签: c++ c++11

在类中使用数据初始化一个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来保存vectorOfLargeClass中创建的main()向量的数据副本。

我使用的是C ++ 11,但我并不完全熟悉这种语言,也许有更好的标准方法来完成这项任务。

3 个答案:

答案 0 :(得分:6)

添加移动构造函数:

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

然后按如下方式使用它:

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

但假设vectorOfLargeClass std::move不再需要main

答案 1 :(得分:4)

您可以这样做:

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

答案 2 :(得分:1)

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

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

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

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

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