일부std :: list <char> 목록 유형을 (char * data, int length)
std::list<char> list_type
이제 목록의 내용을 (char * data, int length)로 제공해야합니다. 목록 내용을 포인터와 길이로 표현하는 편리한 방법이 있습니까? <vector>
과 같은 인터페이스가 있습니까?
미리 감사드립니다.
일부std :: list <char> 목록 유형을 (char * data, int length)
std::list<char> list_type
이제 목록의 내용을 (char * data, int length)로 제공해야합니다. 목록 내용을 포인터와 길이로 표현하는 편리한 방법이 있습니까? <vector>
과 같은 인터페이스가 있습니까?
미리 감사드립니다.
당신은 벡터와 함께 할 수있는 데이터가 연속적으로 저장되기 때문에 : 목록
std::vector<char> vec;
char* data = &vec[0];
int length = static_cast<int>(vec.size());
, 당신은 데이터를 배열에 복사합니다. 다행히도 그것도 상당히 쉽습니다.
std::list<char> list:
int length = static_cast<int>(list.size());
char* data = new char[length]; // create the output array
std::copy(list.begin(), list.end(), data); // copy the contents of the list to the output array
물론, 다시 해제해야하는 동적 할당 배열이 남아 있습니다. 나는 표준 : : 목록 모르는
list
은 연결된 목록 데이터 구조입니다. 전환없이 (이론적으로) 할 수있는 방법은 없습니다.
vector
의 보조 저장소 (C++0x Draft 23.2.6.3)에 .data()
(C++ 0x)으로 액세스 할 수 있습니다. 현재 가장 좋은 방법은 초기 요소의 주소를 가져 와서 배열로 처리하는 것입니다.
이 작업은 벡터가 아닌 목록으로 수행 할 수 있습니다. 벡터는 그래서 당신은 말할 수있는 메모리의 인접하게 덩어리로 보장됩니다 :
char *data = &list_type[0];
std::vector<char>::size_type length = list_type.size();
하지만, 표준 : : 벡터 수행합니다
std::vector<char> list_type;
...
foo(&list_type[0], list_type.size())
표준 : : 문자열이 너무 일을 할 수 있지만, 당신은 아마 이미 그것을 알고있다.
목록을 사용하여 목록 노드에 데이터를 저장하므로 목록에서이를 수행 할 수 없습니다. 그러나 연속적인 메모리에 데이터를 저장하는 벡터를 사용하면이 작업을 수행 할 수 있습니다. 당신은 첫 번째 요소에 대한 포인터를 얻을 수 &v[0]
또는 &*v.begin()
하나를 사용할 수 있습니다
void f(std::list<char>& list)
{
std::vector<char> vec(list.begin(),list.end());
assert(!vec.empty());
c_api_function(&vec[0],vec.size());
// assuming you need the result of the call to replace the list's content
list.assign(vec.begin(),vec.end());
}
참고 그 벡터가 자동으로 무료로 메모리 기능으로 돌아갑니다. 두 가지 이상의 주목할만한 것들이 있습니다 :
v[0]
에 액세스 할 수 없습니다. (v.begin()
을 참조 해제 할 수 없습니다.)std::list
과 std::vector
사이를 앞뒤로 변환하면 실제 성능이 저하 될 수 있습니다. std::vector
으로 모두 전환하는 것이 좋습니다.
사용하는 아마 좋은 생각이다 static_cast (는 list.size()) 또는 static_cast (vec.size()), 크기() 또는하지 않을 수 있습니다 size_t 타입이다의 결과 이후 일부 플랫폼에서는 int로 변환 가능합니다. –
좋은 대답, +1. 하지만 왜 두 세계의 최고 - std :: copy to std :: vector? –
Reunanen
Pukku와 동의하십시오 : 벡터에 복사 할 표준이 필요하지 않습니다. 두 개의 반복자 생성자를 사용하십시오. –