반응형
목록에서 변환 할 하나의 라이너 벡터로
a list<T>
를 로 변환하는 한 줄짜리 가 vector<T>
있습니까?
Google 검색은 수동적이고 긴 변환을 사용하는 많은 결과를 반환합니다. 리스트에서 벡터로의 변환처럼 간단한 일을하기 위해 그렇게 많은 수고를해야할까요?
목록의 모든 요소로만 새 벡터를 만들 수 있습니다.
std::vector<T> v{ std::begin(l), std::end(l) };
여기서 l
A는 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
반응형
'programing' 카테고리의 다른 글
앱 ID와 번들 ID의 차이점은 무엇입니까? (0) | 2021.01.06 |
---|---|
스트리밍 서버에서 RTP와 RTSP의 차이점은 무엇입니까? (0) | 2021.01.06 |
C #의 자동 속성이란 무엇이며 그 용도는 무엇입니까? (0) | 2021.01.06 |
f, T, C, M, P, C, K, # 등과 같은 색상 상자에있는 문자의 Xcode intellisense 의미 (0) | 2021.01.06 |
콘솔 출력을 Java의 문자열로 리디렉션 (0) | 2021.01.06 |