2009-07-19 1 views

답변

4

당신은 벡터와 함께 할 수있는 데이터가 연속적으로 저장되기 때문에 : 목록

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 

물론, 다시 해제해야하는 동적 할당 배열이 남아 있습니다. 나는 표준 : : 목록 모르는

+1

사용하는 아마 좋은 생각이다 static_cast (는 list.size()) 또는 static_cast (vec.size()), 크기() 또는하지 않을 수 있습니다 size_t 타입이다의 결과 이후 일부 플랫폼에서는 int로 변환 가능합니다. –

+1

좋은 대답, +1. 하지만 왜 두 세계의 최고 - std :: copy to std :: vector ? – Reunanen

+0

Pukku와 동의하십시오 : 벡터에 복사 할 표준이 필요하지 않습니다. 두 개의 반복자 생성자를 사용하십시오. –

0

list은 연결된 목록 데이터 구조입니다. 전환없이 (이론적으로) 할 수있는 방법은 없습니다.

vector의 보조 저장소 (C++0x Draft 23.2.6.3)에 .data() (C++ 0x)으로 액세스 할 수 있습니다. 현재 가장 좋은 방법은 초기 요소의 주소를 가져 와서 배열로 처리하는 것입니다.

1

이 작업은 벡터가 아닌 목록으로 수행 할 수 있습니다. 벡터는 그래서 당신은 말할 수있는 메모리의 인접하게 덩어리로 보장됩니다 :

char *data = &list_type[0]; 
std::vector<char>::size_type length = list_type.size(); 
1

하지만, 표준 : : 벡터 수행합니다

std::vector<char> list_type; 

... 

foo(&list_type[0], list_type.size()) 

표준 : : 문자열이 너무 일을 할 수 있지만, 당신은 아마 이미 그것을 알고있다.

1

목록을 사용하여 목록 노드에 데이터를 저장하므로 목록에서이를 수행 할 수 없습니다. 그러나 연속적인 메모리에 데이터를 저장하는 벡터를 사용하면이 작업을 수행 할 수 있습니다. 당신은 첫 번째 요소에 대한 포인터를 얻을 수 &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::liststd::vector 사이를 앞뒤로 변환하면 실제 성능이 저하 될 수 있습니다. std::vector으로 모두 전환하는 것이 좋습니다.
관련 문제