2010-04-28 6 views
0

나는 vector< vector< vector< int>>>을 가지고 있으며,이 코드를 추출하기 위해 vector< vector< int>>을 개별적으로 처리하고 싶습니다.C++ 벡터에서 레퍼런스 추출하기

myMatrix = myCube[anIndex]; 

행렬이 복사됩니다하지만 난 단지 메모리를 절약하기 위해 참조를 원하는 :

문제는 내가 쓸 때이다. 제발 나를 도울 수 있니?

고맙습니다.

+0

질문에 인라인 코드 서식을 추가했습니다. 다음 번에 스스로 할 수있는 방법을보기 위해 출처를보십시오. 이것은 주석에도 적용됩니다. 일반적으로 코멘트가 아닌 질문을 편집하여 추가 정보를 입력해야합니다. 이렇게하면 다른 사람들이 모든 답을 읽지 않고도 모든 관련 정보를 얻을 수 있습니다. –

답변

1

vector< vector< int> >::const_iterator 유형의 반복기를 사용하십시오. 희망이 도움이됩니다.

1

vector::operator[]이 참조를 반환합니다. 복사를 피하기 위해 참조가 그 결과를 본격적인 개체 대신 저장하는 한 참조를 반환합니다.

class Whatever 
{ 
    //... 
    vector<vector<int>>* myMatrix; 
    //... 
} 

    myMatrix = &myCube[anIndex] 

:

vector< vector<int > >& myMatrix = myCube[anIndex]; 
2

그냥 myMatrix라는 클래스의 구성원 인 경우

vector<vector<int> >& myMatrix = myCube[anIndex]; 
+0

(매우 빨리 :) 답변 해 주셔서 감사합니다. 하지만 내 경우 myMatrix는 실제로 클래스 멤버이므로 참조 인 경우 생성자에서 초기화해야합니다. – Archanimus

+0

@Archanimus :'myMatrix'의 인스턴스가 적절한 클래스를 갖는 오버로드를 가지고있는 한 문제가 없습니다. –

+0

@Archanimus : 생성자에서 현재 초기화되는 것은 무엇입니까? 생성자의 이니셜 라이저 목록에서'[] '표현식 (예 : myCube [anIndex])을 사용할 수 있습니다. 당신이 무엇을 하든지간에, 참고 문헌은 되돌릴 수 없습니다. –

0

을 사용하고 생성자 외부로 초기화 할 수 있도록하려면, 당신의 유일한 선택은 포인터를 사용하고 편집 : 생성자에서 myMatrix initialising 함께 살 수 있으면 참조를 사용할 수 있습니다 :

class Whatever 
{ 
    //... 
    vector<vector<int> >& myMatrix; 
    //... 
} 

Whatever::Whatever(vector<vector<vector<int> > >& myCube), int anIndex) 
: myMatrix(myCube[anIndex]) 
{ 
    //... 
} 

덧붙여 말하자면, 코드에서 >을 분리해야합니다 (C++ 0x 준수 컴파일러를 사용하지 않는 한). 그렇지 않으면 컴파일러에서 >>operator>>으로 구문 분석하고 오류를 줄 것입니다. 이 포인터 것처럼

+0

해결책이 있지만 유지 관리 문제가 발생합니다. myMatrix를 참조하는 코드가 많습니다. 실제로 메모리 사용량이 컸다는 사실을 알기 전까지 참조 만 복사되었다고 생각했습니다! – Archanimus

+0

@Rchanimus : 참조가 아닌 포인터가 아닌 변수에 참조를 저장할 수 없습니다. 참조를 사용하면 귀하의 클래스 생성자 및 아무데도 초기화 목록에서 그것을 초기화하는 당신이 그걸로 살 수 있다면 참조를 사용하십시오. 반영하기 위해 내 대답을 업데이 트합니다. – Gorpik

0
대신 사전으로 반복자를 돌려 연산자 [] 사용 기능을 사용

vector< vector< int> >::iterator myMatrixPtr; 

myMatrixPtr = std::advance(myCube, anIndex); 

을 다음과 같이 행렬을 선언 이제 myMatrixPtr 작업을 할 수 있습니다. 참조를 선호하는 경우 초기화 후 초기화 할 수 있습니다.

0

회원 참조에주의하십시오! MyClass의 인스턴스가되기 전에 참조 된 객체가 정리되면 잘못된 참조가 생깁니다. 종종 (항상 그런 것은 아님) 회원 참조를 사용해야하는 경우 설계를 개선 할 수 있다는 조기 경보 신호입니다. 나는 거의 참조 된 객체가 참조보다 오래 머물 것이라고 확신 할 수있는 객체 소유자의 핸들이 아닌 다른 것에 대해서는 멤버 참조를 거의 사용하지 않는다.

수업의 책임을 약간 변경하면 도움이 될 수 있습니다. 지금은 일련의 데이터를 작성한 다음 해당 데이터 집합을 전달할 객체를 만드는 중입니다. 대신, 먼저 개체를 만든 다음 데이터를 직접 개체에 넣는 것이 좋습니다.

// To start, define your class to allow you to build up the data 
class MyMatrix 
{ 
public: 
    MyMatrix() 
    { } 

    void setData (int x, int y, int data) 
    { this->myData [x][y] = data; } 
    int getData (int x, int y) 
    { return this->myData [x][y]; } 

private: 
    vector<vector<int> > myData; 
} 

// Then, create a vector of 6 (or however many you need) matrices 
int numberOfMatrices = 6; 
vector<MyMatrix> myCube (numberOfMatrices); 

// Then, fill in the vector 
for (int matrixIndex = 0; matrixIndex < numberOfMatrices; matrixIndex++) 
    { 
    // Fill in the data for this matrix 
    MyMatrix &currentMatrix = myCube [matrixIndex]; 

    currentMatrix.setData (0 /* x */, 0 /* y */, 0 /* data */); 
    // ... rest of data 
    } 

그런 다음 모든 데이터가 이미 개체에 있으므로 필요에 따라 처리 할 준비가되었습니다. 또한 각 객체는 데이터를 소유하므로 객체가 주변에있는 한 구성원 데이터가 유효합니다. 무엇보다 유용한 멤버 함수가있는 객체를 사용하면 중첩 된 컨테이너 톤보다 훨씬 더 많은 자체 문서화가 가능합니다.

+0

대단히 모든 expla 주셔서 대단히 감사합니다. 국가! 사실, 전 완전히 당신과 동의합니다, 다행스럽게도, 제 경우에는, 저는 데이터가 손실되지 않을 것이라고 확신합니다. 나의 디자인은 나의 수업을 분리함으로써 동기를 부여 받았고, '날짜의 근원은 다른 것들이 될 수있다. – Archanimus