2010-04-28 3 views
6

때로는 std::vector의 시작 주소를 사용하고 일시적으로 해당 주소를 정기적으로 할당 된 버퍼의 주소로 처리하는 것이 유용합니다.
예를 들어이 대체 :이C++ : std :: vector의 시작 주소를 얻는 중입니까?

char* buf = new char[size]; 
fillTheBuffer(buf, size); 
useTheBuffer(buf, size); 
delete[] buf; 

을 :

vector<char> buf(size); 
fillTheBuffer(&buf[0], size); 
useTheBuffer(&buf[0], size); 

이의 장점은 버퍼가 자동으로 할당 해제됩니다 물론이고, 나는 delete[]에 대해 걱정할 필요가 없습니다.

크기가 0 인 경우 문제가 발생합니다.이 경우 첫 번째 버전은 정상적으로 작동합니다. 빈 버퍼는 "할당"되고 이후 함수는 크기 == 0을 얻지 못합니다.
buf[0]0 < size이라는 어설 션이 포함될 수 있으므로 size == 0이면 두 번째 버전이 실패합니다.

벡터가 비어 있어도 벡터 시작 주소를 반환하는 이디엄 &buf[0] 대신 사용할 수있는 방법이 있습니까?

나는 또한 buf.begin()을 사용하는 것으로 생각했지만 표준에 따라 포인터를 반환하지는 않습니다.

+0

이것은 STL 라이브러리의 감독처럼 보입니다. C++은'new T [0]'을 할당하고 이와 같은 상황에 대해 유효한 포인터를 반환 할 수있게 해줍니다. 그러나 STL의 대부분의 구현은 당신이 그 요소 나 다른 것에 할당하는 경우를 위해서만합니다. – AshleysBrain

+0

'& buf [0]'과'buf [0] = 1'의 차이를 어떻게 알 수 있습니까? – shoosh

답변

8

확인해 보시기 바랍니다.

아마도 유틸리티 기능 :

template <class T, class Alloc> 
T* data(std::vector<T, Alloc>& vec) 
{ 
    return vec.empty() ? 0 : &vec[0]; 
} 

template <class T, class Alloc> 
const T* data(const std::vector<T, Alloc>& vec) 
{ 
    return vec.empty() ? 0 : &vec[0]; 
} 
+1

첫 번째 발언 :'T ::'연산자가 오버로딩 된 경우'boost :: addressof'에 투자 할 가치가 있습니까? 둘째 언급 : 두 번째 템플릿 매개 변수 'Alloc'은 함수를 좀 더 보편적으로 만듭니다. –

+1

@Matthieu : 첫 번째 발언 : http://stackoverflow.com/questions/2719832/why-is-overloading-operator-prohibited-for-classes-stored-in-stl-containers. '& t'가 주소를 반환하지 않는 유형은 저장할 수 없습니다. - 두 번째 발언이 답변에 추가되었습니다. – UncleBens

1

함수가 std::basic_string는 당신이 필요로 정확히 않는 data()있는 경우에도, 그것을 위해 없습니다.

당신은 내가 당신이 어떤 경우에 안전해야한다고 생각 buf.size()?&buf[0]:0;

1

같은 것을 사용해야합니다. vector :: operator [int]와 vector :: at (int)의 차이점은 [] 연산자 오버로드가 특별히 이 아니고은 경계 검사를 수행한다는 것입니다. buf [0]을 사용하면 어설 션이 없어야합니다!

+0

슬프게도 당신은 착각을합니다. MSVC2008의 벡터는'operator []'에 어서션을 가지고 있습니다. – shoosh

+0

나를 계몽 해 주셔서 감사합니다! – acanaday

+4

후속 조치로서, 다음과 같은'#define _SECURE_SCL 0'이이 동작을 비활성화한다는 것을 알게되었습니다. – acanaday

1

fillTheBuffer를 변경하고 반복자를 사용하여 Buffer를 사용하면 표준 라이브러리에서와 동일한 방법으로 문제를 해결할 수 있습니다.

관련 문제