2013-11-01 2 views
12

나는 이런 식으로 코드를 작성하는 팀을 보았다. 나는 개인적으로 이것이 벡터가 완전히 다른 방식으로 구현 될 수 있기 때문에 이식성이 없다고 생각한다. 내가 맞습니까?배열과 같은 std :: vector를 처리하기 위해 이식성이있다.

vector<int> a; 
a.push_back(1); 
a.push_back(2); 
a.push_back(3); 

int* b = &a[0]; 
std::cout<< *(b +1); // this will print 2 
+5

사실, 2011 년 현재이 목적을 위해 ['data'] (http://en.cppreference.com/w/cpp/container/vector/data) 멤버 함수가 있습니다. – BoBTFish

+0

@BoBTFish'data'는'const' 한정자를 가지고 있기 때문에'b'는'const int * b'라고 선언해야합니다. – dasblinkenlight

+0

@ 마크 두 번째. 이제 원래의 질문을 모두 상향 조정 해 봅시다. – stijn

답변

21

코드가 정확합니다. std::vector에 저장된 요소는 C++ 03에서 연속적으로 저장됩니다.

벡터는 랜덤 액세스를 반복기를 지원하는 일련의 용기이다

이것은 현재의 표준 초안 C++ N3797 (23.3.6.1)의 중요한 부분이다. 또한, (상각 된) 상수 시간을 삽입하여 을 삽입하고 마지막에 연산을 지 웁니다. 중간에 삽입 및 지우기는 선형 시간 을 취하십시오. 스토리지 관리는 자동으로 처리되지만 효율성을 높이기 위해 힌트 을 제공 할 수 있습니다. 벡터의 요소가 V는 T가 불리언 타입보다 약간 기타 벡터 인 경우, 다음에 식별에 대한 모든 0 <= n < v.size()&v[n] == &v[0] + n 을 따르는 것을 의미 연속적 저장된다.

8

벡터가 구현되는 방법에 관계없이 일관성을 유지하기 위해 표준에 따라 몇 가지 사항이 보장됩니다. std::vector은 항상 메모리에 연속적으로 저장되므로 임의 액세스 반복기에서 작동 할 수 있습니다.

관련 문제