2011-10-01 3 views
4

char 배열을 std::vector<char>으로 전송하는 빠른 (CPU) 방법이 있습니까?숯불 *을 std :: vector로 전송합니다.

내 기능은 다음과 같습니다

void someFunction(char* data, int size) 
{ 
    // Now here I need to make the std::vector<char> 
    // using the data and size. 
} 
+3

: 당신이 정말로 datasize에서 std::vector<char> 필요한 경우, 당신은 하나를 구성해야합니까? – Griwes

답변

15

당신이있어 아무것도 "캐스트"할 수는 없지만 쉽게 C 문자열에서 벡터 구성 할 수 있습니다 :

std::vector<char> v(data, data + size); 

이것은을 만들 것 복사.

6

STL 컨테이너의 일반적인 규칙은 해당 내용의 복사본을 만드는 것입니다. C++ 11에서는 요소를 컨테이너 (예 : emplace_back() 멤버 함수 std::vector)로 이동하는 특별한 방법이 있지만 예제에서는 요소가 char이므로 sizechar 개체.

std::vector을 배열의 길이와 함께 배열에 대한 포인터의 래퍼로 생각하십시오. "char *std::vector<char>에 캐스팅하는 것"과 가장 가까운 것은 벡터의 포인터와 길이를 주어진 포인터와 길이로 바꾸는 것입니다. 그러나 길이는 지정됩니다 (두 가지 가능성은 끝 요소를지나 한 포인터 또는 size_t 값). 주어진 포인터와 길이로 내부 데이터를 교환하는 데 사용할 수있는 std::vector의 표준 구성원 함수는 없습니다.

이것은 이유가 있습니다. std::vector은 포함 된 모든 요소에 대한 소유권 의미를 구현합니다. 기본 배열은 일부 할당 자 (두 번째 템플리트 매개 변수)로 할당되며 기본값은 std::allocator입니다. 내부 구성원을 스왑 할 수 있다면 동일한 힙 할당 루틴 집합을 사용해야합니다. 또한 STL 구현은이 세부 사항을 지정하지 않고 벡터의 "길이"를 저장하는 방법을 수정해야합니다. OOP의 세계에서, 필요한 것보다 더 많은 세부 사항을 지정하는 것은 더 높은 결합으로 이어질 수 있기 때문에 일반적으로 눈살을 찌푸리게됩니다.

그러나 이러한 멤버 함수가 STL 구현을 위해 있다고 가정합니다. 위의 예에서 단순히 data이 할당 된 방법을 모르므로 실수로 할당 된 할당 자로 할당되지 않은 힙 메모리에 std::vector 포인터를 지정할 수 있습니다. 예를 들어 datamalloc으로 할당되었을 수 있으며 벡터는 delete으로 메모리를 해제 할 수 있습니다. 일치하지 않는 할당 및 할당 취소 루틴을 사용하면 정의되지 않은 동작이 발생합니다. someFunction()은 특정 할당 루틴으로 할당 된 데이터 만 수락하도록 요구할 수 있지만 이는 필요한 것보다 더 많은 세부 사항을 다시 지정하는 것입니다.

바라건대 내부 데이터 멤버를 바꿔 std::vector 멤버 함수를 사용하는 것이 좋습니다. 당신이 문자의 벡터를 필요합니까 무엇

std::vector<char> vec(data, data + size); 
관련 문제