programing

목록에서 변환 할 하나의 라이너

nasanasas 2021. 1. 6. 08:26
반응형

목록에서 변환 할 하나의 라이너 벡터로


a list<T>로 변환하는 한 줄짜리 vector<T>있습니까?

Google 검색은 수동적이고 긴 변환을 사용하는 많은 결과를 반환합니다. 리스트에서 벡터로의 변환처럼 간단한 일을하기 위해 그렇게 많은 수고를해야할까요?


목록의 모든 요소로만 새 벡터를 만들 수 있습니다.

std::vector<T> v{ std::begin(l), std::end(l) };

여기서 lA는 std::list<T>. 그러면 목록의 모든 요소가 벡터로 복사됩니다.

C ++ 11 이후로 원래 목록이 더 이상 필요하지 않으면 더 효율적으로 만들 수 있습니다. 복사하는 대신 모든 요소를 ​​벡터로 이동할 수 있습니다.

std::vector<T> v{ std::make_move_iterator(std::begin(l)), 
                  std::make_move_iterator(std::end(l)) };

허용되는 답변 :

std::vector<T> v(std::begin(l), std::end(l));

확실히 정확하지만 그렇지 최적 것을 요구의 최근 변화를 주어 (아주 불행하게도)의 std::list::size()O(1). (예를 들어, gcc가 5+가되기 전까지는 없었던) 의 준수 구현이있는 경우std::list 다음은 상당히 빠릅니다 (50 개 이상의 요소에 도달하면 50 % 정도).

std::vector<T> v;
v.reserve(l.size());
std::copy(std::begin(l), std::end(l), std::back_inserter(v));

하나의 라이너는 아니지만 항상 하나로 포장 할 수 있습니다.


이것은 어떤가요?

list<T> li;
vector<T> vi;        
copy(li.begin(),li.end(),back_inserter(vi));

이 스레드는 이미 오래되었지만 "append ()"는 더 이상 사용할 수 없기 때문에 새로운 emplace_back 한 줄을 보여주고 싶었습니다.

v.emplace_back(l.begin(), l.end());

그러나 이렇게하면 모든 요소가 재구성되므로 가장 빠른 솔루션이 아닐 수 있습니다!

참조 URL : https://stackoverflow.com/questions/5218713/one-liner-to-convert-from-listt-to-vectort

반응형