두 std::vector
s를 어떻게 연결 합니까?
답변
vector1.insert( vector1.end(), vector2.begin(), vector2.end() );
답변
C ++ 11을 사용 중이고 단순히 요소를 복사하지 않고 요소를 이동하려면 std::move_iterator
insert (또는 copy)와 함께 사용할 수 있습니다 .
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char** argv) {
std::vector<int> dest{1,2,3,4,5};
std::vector<int> src{6,7,8,9,10};
// Move elements from src to dest.
// src is left in undefined but safe-to-destruct state.
dest.insert(
dest.end(),
std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end())
);
// Print out concatenated vector.
std::copy(
dest.begin(),
dest.end(),
std::ostream_iterator<int>(std::cout, "\n")
);
return 0;
}
int를 사용하는 예는 복사하는 것보다 효율적이지 않기 때문에 int가있는 예에서는 더 효율적이지 않지만 이동이 최적화 된 데이터 구조의 경우 불필요한 상태를 복사하지 않아도됩니다.
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char** argv) {
std::vector<std::vector<int>> dest{{1,2,3,4,5}, {3,4}};
std::vector<std::vector<int>> src{{6,7,8,9,10}};
// Move elements from src to dest.
// src is left in undefined but safe-to-destruct state.
dest.insert(
dest.end(),
std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end())
);
return 0;
}
이동 후 src의 요소는 정의되지 않았지만 파괴하기에 안전한 상태로 유지되며 이전 요소는 마지막에 dest의 새 요소로 직접 전송되었습니다.
답변
insert 함수 를 다음과 같이 사용합니다 .
vector<int> a, b;
//fill with data
b.insert(b.end(), a.begin(), a.end());
답변
또는 다음을 사용할 수 있습니다.
std::copy(source.begin(), source.end(), std::back_inserter(destination));
이 패턴은 두 벡터가 정확히 같은 유형의 것을 포함하지 않는 경우 유용합니다. std :: back_inserter 대신 무언가를 사용하여 한 유형에서 다른 유형으로 변환 할 수 있기 때문입니다.
답변
C ++ 11에서는 벡터 b를 a에 추가하는 것이 좋습니다.
std::move(b.begin(), b.end(), std::back_inserter(a));
때 a
와 b
중복되지 않고, b
더 이상 사용하지 않을.
답변
std::vector<int> first;
std::vector<int> second;
first.insert(first.end(), second.begin(), second.end());
답변
나는 이미 언급 한 것을 선호합니다 :
a.insert(a.end(), b.begin(), b.end());
그러나 C ++ 11을 사용하는 경우 일반적인 방법이 하나 더 있습니다.
a.insert(std::end(a), std::begin(b), std::end(b));
또한 질문의 일부는 아니지만 reserve
더 나은 성능을 위해 추가하기 전에 사용하는 것이 좋습니다 . 그리고 벡터를 예약하지 않고 자체와 연결하면 실패하므로 항상해야합니다 reserve
.
기본적으로 필요한 것 :
template <typename T>
void Append(std::vector<T>& a, const std::vector<T>& b)
{
a.reserve(a.size() + b.size());
a.insert(a.end(), b.begin(), b.end());
}