2011-12-19 2 views
0

나는 마음에 하나 개의 질문은 내가는 표준 : : 벡터 포인터

std::vector<int> *p; 

처럼 무엇을 쓸 수있다하지만 내가 어떤 상황에서 사용됩니다 여부를 결정 할 수없는 무엇입니까? 또한 포인터 p에 의해중인 크기를 조정할 경우이 경우 포인터 p 발생할 것입니다?

나는 바보처럼 들릴지 모르지만,이 질문들에 착안하여 g ++에서 std::vector<int> *p을 컴파일 할 수 있습니다. 말함으로써

+2

저는 벡터 요소에 대한 포인터에 대한 벡터 포인터를 혼동하고 있다고 생각합니다. 이것은 C와 C++이 네이티브 배열을 처리하는 방식이 이러한 혼란을 조장하기 때문에 아주 이해할 수 있습니다. 그러나 벡터에 대한 포인터는 배열에 대한 포인터와 달리 그 요소와 아무 관련이 없습니다. – Omnifarious

답변

3

는 :

std::vector *p; 

당신은 벡터에 대한 포인터를 선언한다. 이제 메모리 요소를 할당하여 개별 요소가 아닌 Vector 객체의 메모리 내용을 유지해야합니다. 그 후에는 원하는대로 개별 요소를 추가, 제거, 삭제 및 업데이트 할 수 있습니다.

벡터의 크기를 조정할 때, 메모리 p가 참조하는 일은 일어나지 않으며, Vector 객체와 관련된 해당 메모리의 내용 만 변경됩니다.

이러한 구조의 한 가지 용도는 벡터의 동적 배열을 갖는 것입니다. 인접 노드 목록을 유지해야하지만 런타임까지 얼마나 많은 노드가 나타날지 미리 알 수는 없습니다.

+1

동적 인 벡터 배열 대신에 벡터 벡터를 사용할 수 있습니다. 현대 C++ (스마트 포인터를 생각해 보라)에서 이런 식으로 벡터를 선언 할 이유는 거의 없다 (사실, 나는 생각할 수 없다). –

+0

@Shamim, 그래서 벡터 크기 조정의 경우 내 포인터 p가 유효하다고 가정합니다 (내부 메모리 위치조차도 크기 조정 작업 중에 벡터에 대해 변경됩니다). – Ruchi

+0

@Ruchi : 네, 포인터는 여전히 유효합니다. –

0

런타임에 여러 특정 벡터 중 하나를 선택하려는 경우 벡터에 대한 포인터를 사용할 수 있습니다. 이자형. 당신은 그것을 동적으로 선택하기를 원합니다.

"크기 변경"질문에 대해서는 Are vector pointers affected by resize()? 상태이므로 벡터 자체에 대한 포인터는 벡터가있는 한 유효합니다. 그러나 벡터의 요소에 대한 포인터가 변경 될 수 있습니다. 예를 들면 다음과 같습니다.

std::vector<int> v; 
std::vector<int> *p; 
p = &v; // Does not change 

int *pe; 
pe = &v[0]; // May change