2017-06-21 4 views
-3

がスニペットですが、私はベクトルをコピーせずにsecond変数にfirst変数を指すようにしたい:ポインタを変更してベクトルを変更すると、C++で動かないのですか?以下

#include <iostream> 
#include <vector> 

std::vector<int> second (4,100); 
void modify(std::vector<int>* i) { 
    i = &second; 
} 
int main() 
{ 
    std::vector<int> first;        // empty vector of ints 
    modify(&first); 
    for (std::vector<int>::iterator it = first.begin(); it != first.end(); ++it) 
    std::cout << ' ' << *it; 

    std::cout << '\n'; 

    return 0; 
} 

Iが出力さ100 100 100 100ことが期待ながら出力は、空です。

誰もこのようなベクターを変更できない理由についてアイデアはありますか?

+1

同じ方法で「ポインタを変更する」ことで「int」を「変更」できますか?たぶんそれはベクトルとは関係ありませんか? – juanchopanza

答えて

2

ポインタを値渡ししています。つまり、関数の中でポインタがポイントするようにポインタを変更すると、関数の外側には表示されません。コールサイトの変更を表示するには、ポインタを参照渡しする必要があります。以来

modify(&first); 

が右辺値ポインターであり、基準左辺値以外のconstにバインドすることはできませんが、これは、この場合には動作しません。

これはすべて必要ありません。私達はちょうどmodify(first);になり、今で変更がmain()に反映されます

void modify(std::vector<int>& i) { 
    i = second; 
} 

、その後modify(&first);などの参照を取るために機能を変更することができます。

+0

ありがとう!これは価値によってコピーされているのですか、または参照によってコピーされていますか? –

+0

@HanfeiSun私の提案は、値ではなく参照で渡すことです。 – NathanOliver

+0

@HanfeiSunは参照渡しと呼ばれます。コピーは、そのように呼びたい場合は常に「価値によって」です – user463035818

0

あなたの代わりにこの望んでいたように見える:

void modify(std::vector<int>* i) { 
    *i = second; 
} 

それはパラメータを使用して値を変更するには、「古い」方法であり、それは問題がある可能性があります

void modify(std::vector<int>* i) { 
    if(!i) { 
     // what should I do? 
     throw std::runtime_exception("cannot modify vector through nullptr"); 
    } 
    *i = second; 
} 

この追加のチェックを使用して回避することができますがあなたが実際に何らかの理由でnullptrを渡すことを本当に望んでいるのでなければ、コードの読者にあなたの意図をより明確にするでしょう(値を変更しないように指示しますが、例えば別のことをしてください)。

関連する問題