【发布时间】:2017-04-25 09:37:23
【问题描述】:
对于 for 循环的简洁性,我喜欢基于范围的 for 循环。在 for 循环中,我想填充一个我事先知道其大小的向量,但我缺少一个索引值。我现在有两种方法,声明一个向量并使用 push_back 添加元素或创建一个初始化向量(应该更快,因为不需要分配?),计算索引并插入一个元素。
问题:其中一个的性能缺点是什么和/或有更好的实现。
在此示例代码下方,实际代码包含的项目数量相对较少(大概少于 10 个),但它会在此过程中运行数百万次。
//The vector as input for the for loop
std::vector<double> vecIn = { 1, 2, 3, 4, 5 };
//Adding values to vectors, vector size changes on each loop right?
std::vector<double> vecOut1;
//Loop through vector with range looping
for (auto& val : vecIn) {
vecOut1.push_back(val); //In reality val is some calculated value based on the input.
}
//Adding values to initialized vector, but need to calculate index.
std::vector<double> vecOut2(vecIn.size());
//Loop through vector with range looping
for (auto& val : vecIn) {
auto i = &val - &vecIn[0];
vecOut2[i] = val; //In reality val is some calculated value based on the input.
}
我喜欢第一个循环的简短性,但担心性能方面会更糟。
当然,我也可以在循环的开头声明一个索引并对其进行迭代,但这似乎有点违背清洁的目的。
编辑:为了澄清,这是我将一个向量复制到另一个向量的演示代码。在实际程序中,处理输入向量并根据输入向量计算新值。新值需要插入/附加到向量输出。在实际代码中,输入甚至不是向量,而是 boost::ublas::matrix。
【问题讨论】:
-
剖析一下看看:)
-
使用
vector.reserve。 -
如果你想复制整个向量,你可以做
std::vector<double> vecOut1 = vecIn;,图书馆会为你做所有的工作。包括预先分配足够的空间。 -
这是示例代码,当然我想做的不仅仅是将一个向量复制到另一个向量中。
-
添加真实示例,而不仅仅是部分
标签: c++ performance vector initialization range