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

Get reference to uninitialized std::vector element

本文关键字:vector 元素 引用 std 初始化 获取      更新时间:2023-10-16

考虑以下代码段:

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,但这给了我一个"索引越界"错误。

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

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在评论中指出的那样,这种解决方案可能比零初始化更糟糕。我在编译器资源管理器上的快速检查显示它是编译器依赖的,有些总是检查容量,有些优化它。总的来说,我只能建议运行您的分析器,看看在您的情况下什么更快!

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

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线程的安全性。

您还可以通过调整输出向量的大小以匹配输出向量来处理输入向量

长度更改的情况,仅当新大小较大时,输出向量才应重新分配。

也许创建静态向量,这样数据就会从exe文件读取到内存一次。 静态向量 myOutVect(100000);例如:
static vector a(10000); static_cast<向量< int >>(a); auto itr =a.begin(); *itr=10;