2012-03-01 34 views
0

我想以同樣的方式訪問「操作向量」函數中的向量,因爲我訪問的矢量[i]而不是vector-> at(i)in下面的代碼。我試圖直接傳遞向量,而不是數組的指針。但是這似乎破壞了程序。任何想法如何實現?進出口新的使用STD庫,我大多都從C訪問一個像函數內的數組[]內的向量

#include <vector> 
#include <iostream> 
#define vectorsize 5 
struct st_test { 
    int ii; 
    float dd; 
}; 

void manipulatevector(std::vector<struct st_test> *test) { 
    test->resize(vectorsize); 

    for(int i=0;i<vectorsize;i++) { 
     test->at(i).dd = i*0.4f; 
     test->at(i).ii = i; 
    } 
} 

void manipulatearray(struct st_test test[vectorsize]) { 
    for(int i=0;i<vectorsize;i++) { 
     test[i].dd = i*0.4f; 
     test[i].ii = i; 
    } 
} 

void main() { 
    std::vector<struct st_test> test1; 
    manipulatevector(&test1); 

    struct st_test test2[vectorsize]; 
    manipulatearray(test2); 

    std::cout << "Vector" << std::endl; 
    for(int i=0;i<vectorsize;i++) { 
     std::cout << test1.at(i).dd << std::endl; 
    } 

    std::cout << "Array" << std::endl; 
    for(int i=0;i<vectorsize;i++) { 
     std::cout << test2[i].dd << std::endl; 
    } 
} 

回答

7

你有沒有嘗試過把矢量作爲參考?

void manipulatevector(std::vector<struct st_test> &test) { 
    test.resize(vectorsize); 

    for(int i=0;i<vectorsize;i++) { 
     test[i].dd = i*0.4f; 
     test[i].ii = i; 
    } 
} 

std::vector<struct st_test> test1; 
manipulatevector(test1); 
2

經驗,你可以簡單地使用(*test)[i]代替test->at(i)

這實際上不是相同的行爲at VS operator[]),但你可能已經意識到這一點。

1

將它作爲參考,而不是指針。

void manipulatevector(std::vector<struct st_test> &test) { 

然後,您使用.代替->,事情就是這樣的重載[]運營商是可用的。

1

您可以通過引用傳遞vector,並使用[]操作:

void manipulatevector(std::vector<struct st_test>& test) { 
    test.resize(vectorsize); 

    for(int i=0;i<vectorsize;i++) { 
     test[i].dd = i*0.4f; 
     test[i].ii = i; 
    } 
} 

當您直接通過vector,我相信你按值傳遞它:

void manipulatevector(std::vector<struct st_test> test) { 

這意味着任何改變在manipulatevector()內部製作的內容不會被調用者看到。這意味着:

for(int i=0;i<vectorsize;i++) { 
    std::cout << test1.at(i).dd << std::endl; 
} 

會拋出一個std::out_of_range錯誤,從test.at(i),因爲test1不會有vectorsize元素,但零個元素。由於main()中沒有異常處理,這會導致程序崩潰。

+0

'test-> resize(vectorsize);'change to'test.resize(vectorsize);' – neciu 2012-03-01 12:08:20

+0

@neciu,謝謝,完成。 – hmjd 2012-03-01 12:10:29

1

將簽名void manipulatevector(std::vector<struct st_test> *test)更改爲void manipulatevector(std::vector<struct st_test>& test)。然後你可以在矢量上使用operator[]

1

這裏有不同的選項。您可以通過引用傳遞的載體,它是在代碼最簡單和清潔:

void function(std::vector<type>& v) 

現在,在一些商店的風格指南要求,如果你要修改的參數,你通過指針傳遞它,使它在通話的地方是明確的。在這種情況下有不同的選擇調用operator[]

void function(std::vector<type> *v){ 
    (*v)[0] = ....      // dereference first 
    v->operator[](0) = ....   // explicitly cal the operator 
    std::vector<type>& vr =*v; 
    vr[0] = ....      // create reference and use that 

前兩個是等價的,第一是可以說是更容易閱讀。第二個與第一個相同,它取消引用指針然後訪問運算符,但是明確地給出引用的名稱,所以它可以在函數中重用,而不必在所有用途中解引用。雖然這在技術上會創建一個額外的變量,但編譯器很可能會優化參考。