2012-03-01 8 views
0

私はvector-> at(i)ではなく、vector [i]の配列にアクセスするのと同じ方法で、以下の "manipulatevector"関数のベクトルにアクセスしたい以下のコード。私は配列を使って行うことができるように、ポインタを直接渡すことを試みました。しかし、これはプログラムを破損しているようです。どのようにこれを達成することができる任意のアイデア?私は主に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

から経験を持っているように、STDライブラリを使用する新しいイムあなたは、単に(*test)[i]の代わりtest->at(i)使用することができます。

は、これは実際には同じ行動operator[]at)ではありませんが、あなたはおそらくすでにその認識しています。

1

代わりにポインタの参照として渡します。

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

あなたは、代わりに->.を使用して、オーバーロードされた[]オペレータのようなものが使用可能です。

1

あなたが参照によってvectorを渡し、[]演算子を使用することができます任意の変更を意味

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

を:あなたは直接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; 
    } 
} 

manipulatevector()の中に作られたものは、発信者には見えません。これは意味します:test1vectorsize要素が、ゼロの要素を持っていないよう

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

は、test.at(i)から、std::out_of_rangeエラーをスローします。 main()に例外処理がないため、プログラムがクラッシュする原因となります。

+0

'test-> resize(vectorsize);' test.resize(vectorsize)に変更します。 ' – neciu

+0

@neciu、ありがとう。 – hmjd

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 

最初の2つは、最初の読み間違いなく容易であると共に、等価です。2番目は、ポインタを逆参照して演算子にアクセスするという点で、最初のものと同等ですが、参照に明示的に名前を付けるので、すべての用途で逆参照することなく関数内で再利用できます。これは技術的に余分な変数を作成しますが、コンパイラはリファレンスを最適化するでしょう。

関連する問題