获取对未初始化的 std::vector 元素的引用
Get reference to uninitialized std::vector element
考虑以下代码段:
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_back
或emplace_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;
- 对 Vector 元素 (C++) 的push_back操作
- 有没有函数可以直接获取 std::vector 元素的大小?
- 使用 stl 排列 std::vector 元素的最短解决方案
- 在不调用构造函数的情况下创建 Vector 元素
- 分配std :: vector元素的两种方法
- 如何对std::vector元素中的对象使用shared_mutex
- 在 GDB 漂亮的打印机中显示特定的 std::vector 元素
- 将分配到std :: vector元素线程安全
- 是否可以使用 std::vector 元素的地址作为指针
- 访问std::vector元素的速度会随着向量大小而减慢
- 指向 std::vector 元素时编译器错误<bool>?
- 通过 std::vector.data() 指向 std::vector 元素的指针指向损坏的数据
- 指向所有 std::vector 元素的指针
- 调用在函数调用期间重新分配的“std::vector”元素的函数是否会导致麻烦
- 使用下标运算符进行Integer Vector元素比较失败,但使用at函数成功
- 填充一个无序的vector元素指针队列
- 将vector元素赋值给调用emplace_back的函数的result
- 调用带有引用vector元素参数的c++函数
- 将vector元素转换为字符串进行比较
- vector元素被覆盖