2011-02-11 2 views
1

가정하자 I가내부 색인 참조?

난 "외부"이고, j는 "내부"인
a[i][j] = stuff; 

로 인덱싱

vector<vector<int> > a; 

... 다음에 "외부에 대한 참조를 생성

"벡터는 간단하다의 I에 대한 참조를 만들 수있는 좋은 방법은

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

있는가 너?

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

감사합니다.

+0

나는 그 질문을 이해하지 못한다. 'a'는 외부 벡터이므로'a [x]'는 내부 벡터 중 하나에 접근합니다 (벡터 벡터를 정의 했으므로 내부 벡터는 하나가 아닙니다). 한 단계 아래로 내려 가면 개별 정수가됩니다. –

+0

질문이 혼란 스럽습니다. int의 참조를 벡터 에 어떻게 만들 수 있습니까? –

답변

1

불행하게도, 아니, 컴파일러는

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

operator []에 대한 첫 번째 호출은 실제로 vector을 다시 손을 경우에만 의미가 같은이 치료를하기 때문에 그런 참조를 만드는 직접적인 방법은 없습니다.

그러나 행동을 구체적으로 처리하는 새 클래스를 도입하여이 동작을 속일 수 있습니다. 이 클래스에 두 번째 인덱스를 저장하고 첫 번째 인덱스가 주어진 경우 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 클래스의 templatized 버전을 작성합니다. – Keith

1

이 라인 :

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

는 외측 벡터를 참조하지만, 벡터 내 오히려 아니다. 또한 가능한 많은 내부 벡터가 있음에 유의하십시오.

여기에 (일반적으로는 무의미하지만) 외부 벡터에 대한 참조를 얻는 방법은 다음과 같습니다

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

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

얻기 내부 벡터 중 하나에 대한 참조는 다음과 같이 보입니다