2

ペアとベクトルで構成されるベクトルを定義しました。読みやすくするために、私はこれを行います

#include <iostream>
#include <vector>
using namespace std;
class foo {
public:
  vector< pair<int, vector<int> > > v;
  vector< pair<int, vector<int> > >::iterator it;
  void bar() 
  {
    for( it = v.begin(); it != v.end(); it++ ) {
      if ( 10 == (*it).first ) {
          vector<int> a = (*it).second;   // NOTE
          a[0] = a[0]*2;                  // NOTE
      }
    }
  }
};

int main()
{
  foo f;
  f.bar();
  return 0;
}

ご覧のとおり、簡単に操作できるように(*it).second変数を割り当てています。a問題は、の値を変更してaも元のベクトルvが変更されないことです。私はその変化a(*it).secondループのあらゆる場所に解決することができます。ただし、これによりコードが読みにくくなります。

a変更をオリジナルに反映する方法はありますvか?私はこのように参照によって呼び出す必要があります

vector<int> a = &(*it).second;

動作しません

4

3 に答える 3

3

a参照として宣言する必要があります。

vector<int>& a = (*it).second;

アンパサンド instd::vector<int> a = &(*it).second;はアドレス演算子として解析されておりa、ポインターではありません。そのため、動作/コンパイルしません。

于 2013-01-22T10:58:34.243 に答える
2

まず第一に、vメンバーをどのように埋めるか、いつ初期化するかを示すコードはありませんit。結局、有効であることを確認してくださいit(ベクトルへのすべてのイテレータは、v変更後に無効になる可能性があることに注意してください)

そして2番目:正しい行は次のようになります

vector<int>& a = it->second;

(代わりにアドレスを取得すると、スニペットはコンパイルされません)

于 2013-01-22T11:02:28.300 に答える
2

元のベクトルの値を変更できるのは、それを参照に取り込む場合だけです。しかし、代わりにコード内でそのコピーを作成し、元のベクトルに影響を与えないそのコピーを変更しています。

代わりに参照するvector<int> a必要があります。

vector<int> &a...
于 2013-01-22T11:01:11.837 に答える