2011-02-11 25 views
1

私は "外側" であり、jは "内側" である内部インデックスへの参照?

a[i][j] = stuff; 

...

は次に「外側への参照を作成するように索引付けされ

vector<vector<int> > a; 

があると"ベクターは簡単です:

vector<int>& b = a[x]; 

iへの参照を作成する良い方法はありますか鼻?

vector<int>& b = a[<don't know>][x]; 

ありがとうございます。

+0

私はその質問を理解していません。 'a'は外側のベクトルなので、' a [x] 'は内部ベクトルの1つにアクセスします(ベクトルのベクトルを定義したので、内部ベクトルは1つだけではありません)。 1つ下のレベルでは、個々の整数に到達します。 –

+0

質問が混乱しています。 intの参照をベクトルにどのように作成できますか? –

答えて

1

残念ながら、ない、コンパイラは

a.operator[] (/* ... don't know ... */).operator[] (x); 

operator []への最初の呼び出しが実際にvectorを手の甲場合にのみ意味があるように、この治療されているため、そのような参照を作成するための直接的な方法はありません。

ただし、動作を具体的に処理する新しいクラスを導入することで、この動作を偽装することができます。このクラスに2番目のインデックスを格納させ、最初のインデックスが与えられたときvectorの実際の値を参照する関数operator[]を提供することです。ここでは一例です:

class IndexReverser { // Or, your favorite name 
public: 
    IndexReverser(vector< vector<int> >& v, size_t index); 

    int& operator[] (size_t firstIndex); 

private: 
    vector< vector<int> >& realVector; 
    const size_t secondIndex; 
}; 

IndexReverser::IndexReverser(vector< vector<int> >&v, 
          size_t index) : realVector(v), secondIndex(index) { 
    // Handled in initialization list 
} 
int& IndexReverser::operator[] (size_t firstIndex) { 
    return realVector[firstIndex][secondIndex]; 
} 
その後、書くことができ

、例えば、この:

IndexReverser ir(a, j); 
ir[i] = 137; 

あなたはconstベクトルを処理するために双子のクラスを提供する必要があるかもしれません、そしておそらく全体の構造をパラメータ化したいと思います格納されている要素の型に依存します。私はこれがあなたが探しているものかどうかは分かりませんが、原則としてあなたが望む行動を得ることができることを示しています。

+0

ありがとう、それは私の質問に答える。私はあなたのIndexReverserクラスのテンプレート化バージョンを記述します。 – Keith

1

この行:

vector<int>& b = a[x]; 

が外側ベクトルへの参照ではなく、内側ベクトルのうちの1つではありません。また、多くの内部ベクトルが可能であることに注意してください。

は、ここで(一般的に、それは無意味だろうが)外側のベクトルへの参照を取得する方法は次のとおりです。

vector<int> &inner = a[x]; 

vector<vector<int> > &outer = a; 

取得インナーベクトルのうちの1つを参照するには、次のようになります

関連する問題