获取对未初始化的std :: vector元素的引用

时间:2016-07-07 09:57:38

标签: c++ performance vector stdvector

考虑以下代码:

void ProcessVect(std::vector<double>& myInVect)
{
    std::vector<double> myOutVect(myInVect.size());

    for (size_t i =0; i < myInVect.size(); i++)
    {
        ProcessValue(myInVect[i], myOutVect[i]); // ProcessValue(double in, double& out);
    }

    DoSomething(myOutVect);
}

此代码有效,但缺点是myOutVect首先用零初始化,而不是由ProcessValue中计算的值覆盖。

我必须为大型矢量和速度问题做这件事。函数ProcessValue无法更改为接受向量。

现在我的问题: 有没有办法将对未初始化的向量元素的引用传递给函数?

我在没有初始化myOutVect.reserve()的情况下尝试了myOutVect,但这给了我一个“索引越界”错误。

我的问题的其他解决方案当然也是受欢迎的。

3 个答案:

答案 0 :(得分:0)

std::vector::reserve似乎是一种很好的方式。

你可能得到了异常,因为reserve只分配内存,它不会改变长度。因此,您仍然需要致电push_backemplace_back

试试这个:

void ProcessVect(std::vector<double>& myInVect)
{
    std::vector<double> myOutVect;
    myOutVect.reserve(myInVect.size());

    for (size_t i =0; i < myInVect.size(); i++)
    {
        double v;
        ProcessValue(myInVect[i], v); // ProcessValue(double in, double& out);
        myOutVect.push_back(v);
    }

    DoSomething(myOutVect);
}

编辑:正如Matteo在评论中指出的那样,这个解决方案可能比零初始化更糟糕。在Compiler Explorer上对我的快速检查表明它依赖于编译器,有些总是检查容量,有些则优化它。总的来说,我只建议你运行你的探查器,看看在你的情况下什么更快!

答案 1 :(得分:0)

一个有用的技巧是避免通过将结果向量作为参数传递来重新创建(并重新归零)结果向量:

void ProcessVect(std::vector<double>& myInVect, std::vector<double>& myOutVect)
{
    assert(myInVect.size()==myOutVect.size());
    for (size_t i =0; i < myInVect.size(); i++)
    {
        ProcessValue(myInVect[i], myOutVect[i]); // ProcessValue(double in, double& out);
    }
    DoSomething(myOutVect);
}

然后,呼叫者可以在重复呼叫中重复使用相同的输出向量。

如果你在课堂上,你可以让myOutVect成为一个班级成员,但要注意它会使ProcessVect的线程更安全。

您还可以通过调整输出向量的大小以匹配来处理输入向量长度发生变化的情况,只有在新大小较大时才应重新分配。

答案 2 :(得分:-1)

也许创建静态向量,因此数据将从exe文件重新存储到内存一次。 static vector myOutVect(100000); 例如:
    static vector a(10000); static_cast<vector<int>>(a); auto itr =a.begin(); *itr=10;