2013-04-08 6 views
13

によってベクトルを渡すは、私はそのような何かをしたい、通常のC配列を使用して参照

void do_something(int el, std::vector<int> **arr) 
{ 
    *arr.push_front(el); // this is what the function above does 
} 

しかし、 "式はクラスタイプを持っていなければなりません"と表示されます。どのようにこれを正しく行うには?

+0

'' intは** arr''? ? 2d配列を直接割り当てる方法は? 2次元配列が必要な場合は、 '' foo(vector >&arr) ''を実行します。 – gongzhitaao

+1

私は彼が多分二次元配列ではなく配列へのポインタを渡そうとしていたと思います。間違っていると私に訂正してください。 – Mppl

+0

多くの答えがありますが、配列のポインタではなくポインタの配列です。彼らは 'std :: vector 'を望んでいます。 –

答えて

7
void do_something(int el, std::vector<int> **arr) 

参照により

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
} 

パスは、C++で&を使用するために簡略化されていなければなりません。あなたはstd::vector<int>& arrと整数値の引数を取るために、あなたの関数を定義した場合

+0

@taocp、 'Pass by referenceはC++で&を使うために簡略化されました'という意味ですか? – gen

+1

@genそれは貧弱な表現です。 C++で実際に変更されたのは、実際には参照渡しがすべてであるということでした。 Cはしません。ポインターを渡すことで同じ結果が得られ、ポインター逆参照の結果を変更すると、元の場所(一時コピーではない)のポインティングされた値が変更されることになります。しかし、それは参照渡しではありません。ポインタは値渡しされます。 –

9

、あなたはその関数内push_backを使用することができます。

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
    //.... 
} 

使用:あなたが使用する必要はありません

std::vector<int> arr; 
do_something(1, arr); 
1

** arr:

void do_something(int el, std::vector<int> *arr){ 
    arr->push_back(el); 
} 

または:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

** ARRは意味がありませんが、あなたはそれを使用して主張している場合は、それをこのように実行します。あなたができる

void do_something(int el, std::vector<int> **arr){ 
    (*arr)->push_back(el); 
} 

が、再びそうする理由はありません...

+3

ベクトルには 'push_front'がありません。 – Rapptz

3

ちょうどこのような参照によってパスベクトル:ただし

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

は、このFは注意あなたの配列関数の実際にはは、の最初の要素を変更します(または値を初期化する)一方で、は新しい要素をベクトルの後ろのに追加します。 (ベクトルが空の場合)のどちらかが最初の要素を追加します。このように

void do_something(int el, std::vector<int> &arr){ 
    if (arr.size() == 0) { // can't modify value of non-existent element 
     arr.push_back(el); 
    } else { 
     arr[0] = el; 
    } 
} 

をかが最初の要素が既に存在する場合(その値を変更します。

まったく同じ結果を達成するために次のように記述すべきです)。

25

機能で変更するために、参照によってコンテナを渡すことができます。その他の答えは、std::vectorにはpush_frontのメンバー関数がありません。

void do_something(int el, std::vector<int> &arr){ 
    arr.insert(arr.begin(), el); 
} 

を、またはその代わり償却O(1)の挿入のためにstd::dequeを使用します:あなたはO(n)を挿入するためvectorinsert()メンバ関数を使用することができます

void do_something(int el, std::deque<int> &arr){ 
    arr.push_front(el); 
}