我只是想更多地進入stl語義,並將舊的循環轉換爲適當的算法。我無法弄清楚將此循環轉換爲複製調用的最佳方式。有任何想法嗎?使用複製與多維數組
vector< vector<float> > rvec;
const float * r[Max] = ...;
// ...
for (int ri=0; ri<N; ri++)
for (int rj=0; rj<M; rj++)
rvec[ri][rj] = r[ri][rj];
我只是想更多地進入stl語義,並將舊的循環轉換爲適當的算法。我無法弄清楚將此循環轉換爲複製調用的最佳方式。有任何想法嗎?使用複製與多維數組
vector< vector<float> > rvec;
const float * r[Max] = ...;
// ...
for (int ri=0; ri<N; ri++)
for (int rj=0; rj<M; rj++)
rvec[ri][rj] = r[ri][rj];
rvec.resize(Max);
for (int i = 0; i < Max; ++i) {
rvec[i].resize(M);
std::copy(r[i], r[i] + M, rvec[i].begin());
}
如果rvec
本身和rvec
中的每個向量已經具有正確的大小,則不需要調整大小。
不知道你可以只用標準算法和沒有仿函數做到這一點(和那些,代碼勢必會比上述顯著增長)。
你知道,有時一個簡單的循環是最好的。 STL的算法非常好,但由於C++沒有匿名函數或內置lambda表達式,因此採用完美可讀的代碼(例如上面顯示的代碼並將其轉換爲STL算法)比實際的改進更具智慧,
在這種情況下,將代碼保持原樣並不是那麼糟糕。雖然如果你多次寫它到一個單獨的函數將是一個好主意。還有一點需要考慮,任何不保留或調整大小的解決方案都會浪費時間複製不需要的內容。
這裏是我做了一個有點迅速迭代器的例子...
#include <algorithm>
using std::copy;
using std::for_each;
using std::random_shuffle;
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::iterator;
using std::vector;
void Write(int i)
{
cout << i << endl;
}
int main()
{
const short MAX_LIST = 1000,
MAX_NUMBER = 100;
float number = 0;
vector<vector<float> > v (MAX_LIST),
v2 (MAX_LIST);
vector<float> list(MAX_NUMBER);
//Fills list and fills v with list
for(vector<vector<float> >::iterator v_iter = v.begin(); v_iter != v.end(); ++v_iter)
{
for(vector<float>::iterator list_iter = list.begin(); list_iter != list.end(); ++list_iter)
{
*list_iter = number;
++number;
}
*v_iter = list;
}
//write v to console
for(vector<vector<float> >::iterator v_iter = v.begin(); v_iter != v.end(); ++v_iter)
{
for_each(v_iter->begin(), v_iter->end(), Write);
}
//copy v to v2
cout << "Copying..." << endl;
copy(v.begin(), v.end(), v2.begin());
cout << "Finished copying!" << endl;
cout<< "Shuffling..." << endl;
random_shuffle(v2.begin(), v2.end());
cout << "Finished shuffling!" << endl;
//write v2 to console
for(vector<vector<float> >::iterator v_iter = v2.begin(); v_iter != v2.end(); ++v_iter)
{
for_each(v_iter->begin(), v_iter->end(), Write);
}
}
同意。爲了使用STL的copy()函數而遍地放置迭代器並不值得讓你已經擁有的代碼膨脹起來。 – 2009-07-02 17:29:46
匿名Lambda是C++ 0x標準的一部分,其中大部分已被當前編譯器支持。可能值得嘗試看看是否有效。 – SingleNegationElimination 2009-07-02 17:36:18
+1。對於大多數代碼來說,可讀性(==可維護性)勝過其他問題。好的,如果你發現自己做了很多這樣的事情,考慮創建你自己的2D(或N-D)副本()函數模板。 –
2009-07-03 05:07:58