2009-07-02 87 views
1

我只是想更多地進入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]; 

回答

7
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中的每個向量已經具有正確的大小,則不需要調整大小。

2

不知道你可以只用標準算法和沒有仿函數做到這一點(和那些,代碼勢必會比上述顯著增長)。

你知道,有時一個簡單的循環是最好的。 STL的算法非常好,但由於C++沒有匿名函數或內置lambda表達式,因此採用完美可讀的代碼(例如上面顯示的代碼並將其轉換爲STL算法)比實際的改進更具智慧,

+0

同意。爲了使用STL的copy()函數而遍地放置迭代器並不值得讓你已經擁有的代碼膨脹起來。 – 2009-07-02 17:29:46

+1

匿名Lambda是C++ 0x標準的一部分,其中大部分已被當前編譯器支持。可能值得嘗試看看是否有效。 – SingleNegationElimination 2009-07-02 17:36:18

+0

+1。對於大多數代碼來說,可讀性(==可維護性)勝過其他問題。好的,如果你發現自己做了很多這樣的事情,考慮創建你自己的2D(或N-D)副本()函數模板。 – 2009-07-03 05:07:58

1

在這種情況下,將代碼保持原樣並不是那麼糟糕。雖然如果你多次寫它到一個單獨的函數將是一個好主意。還有一點需要考慮,任何不保留或調整大小的解決方案都會浪費時間複製不需要的內容。

0

這裏是我做了一個有點迅速迭代器的例子...

#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); 
    } 
}