對於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'。 – nwp
如果你想複製整個矢量,你可以做'std :: vector vecOut1 = vecIn;'這個庫會爲你做所有的工作。包括預先分配足夠的空間。 –