2012-11-18 2 views
2

코스에 대한 포인터를 포함하는 벡터 벡터를 초기화하고 싶습니다. 나는이 선언 :벡터 벡터, 힙 대 스택 (C++)

, 각 내부 벡터 과정에 대한 포인터를 포함하는 벡터이고, I는 크기 int smsNum 될 메인 벡터를 원하는 내가이 벡터의 벡터를 가지고있다가하고 싶어
std::vector<std::vector<Course*> > *CSPlan = 
     new std::vector<std::vector<Course*> >(smsNum); 

. 게다가, 나는 그것을 더미에서 원했다.

내 질문은 :

  1. 모두 주요 벡터와 힙에 할당 된 내부 벡터 있습니까? 아니면 MAIN 벡터가 힙에 있고 인덱스가 스택상의 다른 작은 벡터에 대한 포인터입니까?

  2. 크기가 int smsNum 인 것으로 선언되었으므로 주 벡터의 크기는 10이지만 작은 벡터는 무엇입니까? 그것들도 그 크기입니까, 아니면 아직도 동적입니까? 나머지는 동적하면서 결국

내 목표는, 메인 벡터와 힙 자식 벡터, 오직 주 벡터 크기 smsNum의 모두를 벡터의 벡터를하는 것입니다.

+0

여기서 포인터를 사용하는 이유는 무엇입니까? 그들은 코드를 더 복잡하게 만들고 기회는 필요하지 않습니다. –

+0

이 CSPlan을 컴퓨터 과학 학생에게 구성원 필드로 저장하고 특정 상황에서 작업을 수행하기 때문에이 CSPlan을 필요로합니다. – TheNotMe

+0

그 설명을 위해, 당신은 여전히 ​​포인터가 필요하지 않습니다. –

답변

4

사용자가 원하는만큼 커질 수있는 구조는 힙에 할당됩니다. 한편, 메모리 스택은 컴파일 과정에서 정적으로 할당 된 변수를 할당하는 데 사용되며, 프로그램은 정적으로 크기를 제어합니다. 이 같은 루프를 가질 수 있기 때문에

:

for (i = 0; i < your_value; i++) { 
    vector.insert(...); 
} 

표준 입력에서 읽은 정수로 your_value을 고려는, 컴파일러, 즉, 귀하의 벡터 얼마나 큰에 제어 할 수 없습니다를, 그렇지 않습니다 수행 할 수있는 인서트의 최대 양이 얼마인지 알아야합니다.

이 문제를 해결하려면 OS가 허용하는만큼 커질 수있는 힙에 구조를 할당해야합니다. 기본 메모리를 고려하고 스왑합니다. 벡터를 가리키는 포인터를 사용하면 벡터를 참조하는 변수를 동적으로 할당하게됩니다. 이것은 이 아닌을 벡터의 내용이 반드시 힙에 할당된다는 사실을 변경합니다.

당신은해야합니다

, 당신의 스택 :

  • 변수 "X"변수 "Y"의 주소를 저장;

및 힙에 :

  • 변수 "Y", 즉 벡터하여 벡터에 대한 참조 인 값;

  • 벡터 벡터 벡터의 내용 ("y"로 액세스 됨, "x"로 액세스 됨).