2012-06-24 2 views
2

2 차원 배열을 컴파일 타임에 알 수없는 함수에 전달하려고 시도했지만 포기했습니다. 약간의 연구가 끝나면 2 차원 벡터가 좋은 대안이 될 것으로 보인다. 난 그냥이 공백 문자를 포함 할 각 셀을 initializaing, 차원 totalRows X totalColumns의 2 차원 벡터를 선언하는 올바른 방법인지 확인하려면 :2d 벡터 초기화

vector<vector<char> > world(totalRows, vector<char>(totalColumns, ' ')); 
+3

이것은 약간의 학대입니다. 벡터의 벡터는 각 행이 다른 길이를 가질 수 있기 때문에 반드시 2 차원 배열 일 필요는 없습니다. 1d와 2d 배열의 차이점은 대부분 문법적이므로 2 차원 배열 구문을 고민 할 필요가 없습니다. 선은 괜찮아 보인다. –

+0

사양이 약간 불완전합니다. 예를 들어 모든 행 (또는 행렬을 좋아하는 방식에 따라 모든 열)의 길이가 동일하도록 적용 하시겠습니까? 벡터 벡터는 여기서 당신을 그렇게 도울 수 없습니다. 벡터의 벡터는 메모리의 연속적인 덩어리를 차지할 필요는 없으며 성능 문제가있을 수 있습니다. 또한 const 정확성을 지원하는 것이 까다로울 것입니다. – Rook

답변

4

귀하의 코드가 작동합니다. 의견에서 알 수 있듯이 vector<vector<T>>은 진정으로 2D 배열이 아닙니다. line x column (또는 column x line)

+0

흠, 그렇게해서 벡터 요소에 액세스 할 수 있습니까? world [row] [column]? – AlmostSurely

+1

네, 왜냐하면'world [row]'는 특정 행의 벡터에 대한 참조를 반환하기 때문에'[column]'으로 원소를 얻습니다. – Synxis

9

라인 자체가 일을하고 잘 보이는한다 : 여기

중요한 것은 (totalRows, vector<char>(totalColumns, ' '))(totalColumns, vector<char>(totalRows, ' '))만큼 항상 벡터를 만드는 데 사용되는 규칙을 따를 때, 상응하는 점이다. 그러나 좀 더 많은 정보를 제공하겠습니다.

표준 라이브러리를 사용해 보시기 바랍니다. 그렇게 말하면 머리 속에있는 2D 배열의 이미지가 메모리에 선형 적으로 존재해야한다는 것을 이해해야합니다. 문자로 이루어진 m * n 요소 벡터를 쉽게 만들고 (예를 들어) 0부터 시작하는 계수에 따라 (i * n + j)와 같이 현명한 행으로 색인을 생성 할 수 있습니다.

실제로 "2 차원"배열이 작동하는 방식입니다. 예를 들어, 요소의 일반 배열을 수행 할 때 (T[][]) 포인터로 감쇠하려고하면 간단한 T*이됩니다. 두건의 밑에, 기억은 연속적으로 그리고 선형으로 계획되고, 아무 모양도없고, 다만 1 개의 긴 거리 (컴퓨터는 그것을 본다). 그리고 그것은 인간이 첫 번째 단락에서 표현 (또는 비슷한 것을 사용)함으로써 그것을 볼 때 단순히 행과 열의 개념을 추론합니다. 컴퓨터는 상관하지 않습니다.

vector은 서명 C++ (그리고 비 대한 C가 아닌) 방식으로 배열을 캡슐화하는 표준 라이브러리의 멋진 부분입니다. 매우 설계되어있어 내부 배열 데이터 구조의 크기를 쉽게 조정할 수 있으며 C++ 11의 출현으로 이동 구문이 더 작은 작업의 크기를 조정할 수 있습니다. 또한 RAII 개념을 적용하여 생성자에서 데이터 멤버를 신중하게 초기화하고 소멸자에서 해방시키려는 아이디어를 사용하면이라는 동적 메모리 할당 의 문제를 회피하고 단순히 스택에 새 객체를 전파하고 필요할 때 참조를 전달합니다 범위를 "종료"합니다.

한 가지주의해야 할 점은 vector은 새로운 요소가 터지거나 밀려 나기 때문에 실제 배열의 크기를 초과 할 수도있는 배열 인 내부 메모리 블록을 만듭니다. 또한 처음에는 크기를 정의 할 의무가 없지만 push_back, push_front 등으로 쉽게 확장 할 수 있습니다. 즉, 이동 시멘틱스를 사용하는 경우에도 다른 것들이 즉시 변경 될 수 있으며 확장은 상당한 비용이 발생할 수 있음을 의미합니다. .

벡터에서 벗어나는 유일한 이유는 데이터 지향적 인 3D 렌더링이나 시뮬레이션을 수행 할 때 매우 맞춤적이고 구체적인 방법으로 데이터를 채우고 수동으로 주변을 뒤섞어 놓을 때뿐입니다. vector가 쉽게 허용되지 않을 수 있습니다. 하지만 그것은 누드 배열의 더 낮은 레벨 영역으로 당신을 밀어 넣을 것입니다 (그리고 당신은 그것을 준비해야합니다). 당신이 이것을 취해야 할 핵심 사항은 단순히 "정신 2D 배열"벡터 (실제로 데이터는 실제 기하학적 모양을 갖지 않으며, 우리 인간, 괴로워하는 사람, 그것을 보는 것입니다)를 벡터로 취급하고 다르게 색인을 붙일 수 있다는 것입니다. 모든 행 데이터를 순차적으로 하나씩 입력해야하며, (i * n + j)를 사용하여 간단히 검색/색인 할 수있는 매우 간단한 레이아웃을 얻을 수 있습니다. 여기서 [i, j]는 고전적인 2D 행렬입니다 subscripting/indexing.당신이 그것에 데이터를 밀어 후

vector<char> world(totalRows*totalColumns, ' '); 

그리고 (내가 N + J *)로 당신은 단순히 색인, 그것은 갈 필요 참조로 전달합니다

다음에, 것처럼 간단 할 수있다 정확히.

코드가 작동해야하지만 불필요한 부 풀림은 데이터를 조작하고 불필요한 내용을 쓰거나 쓸 때 불필요한 정신적 인 오버 헤드를 유발할 수 있습니다. 실제로 i * n + j의 "수동 인덱싱"접근 방식을 사용하는 것보다 훨씬 적습니다. 문자의 2D 배열/행렬을 마음에 그리십시오. 당신이 기꺼이한다면, 당신은 구문론적인 설탕을 추가하기 위해 기능을 무시할 수도 있습니다.