나는 복사해야합니다 std::set
에 std::vector
:
std::set <double> input;
input.insert(5);
input.insert(6);
std::vector <double> output;
std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
문제는 어디에 있습니까?
나는 복사해야합니다 std::set
에 std::vector
:
std::set <double> input;
input.insert(5);
input.insert(6);
std::vector <double> output;
std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
문제는 어디에 있습니까?
답변:
당신은 사용해야합니다 back_inserter
:
std::copy(input.begin(), input.end(), std::back_inserter(output));
std::copy
삽입하는 컨테이너에 요소를 추가하지 않습니다. 컨테이너에는 반복자가 있습니다. 이 때문에 출력 반복자를 직접로 전달하는 경우 std::copy
입력 범위를 보유하기에 충분한 범위를 가리키는 지 확인해야합니다.
std::back_inserter
push_back
각 요소의 컨테이너를 호출하는 출력 반복자를 작성하여 각 요소가 컨테이너에 삽입됩니다. 또는 std::vector
복사 할 범위를 보유 하기에 충분한 수의 요소를 만들 수도 있습니다 .
std::vector<double> output(input.size());
std::copy(input.begin(), input.end(), output.begin());
또는 std::vector
범위 생성자를 사용할 수 있습니다 .
std::vector<double> output(input.begin(), input.end());
output.insert(output.end(), input.begin(), input.end());
대신 대신 할 수 없었 습니까?
output.insert(output.cend(), input.cbegin(), input.cend());
어떻게 생각하십니까? 감사.
input,size()
빈 항목 의 배열을 만든 다음 그 뒤에 추가를 추가합니다. 나는 당신이 사용하는 것을 의미한다고 생각합니다 std::vector<double> output; output.reserve(input.size()); std::copy(...);
.
벡터 객체에 세트의 내용을 담을 공간이 충분하지 않습니다.
std::vector<double> output(input.size());
std::copy(input.begin(), input.end(), output.begin());
가장 효율적인 방법은 요소를 미리 할당 한 다음 배치하는 것입니다.
template <typename T>
std::vector<T> VectorFromSet(const std::set<T>& from)
{
std::vector<T> to;
to.reserve(from.size());
for (auto const& value : from)
to.emplace_back(value);
return to;
}
이렇게하면 기본 생성자를 먼저 호출하는 대신 위에 나열된 다른 솔루션에 대한 할당 할당 연산자를 사용하는 대신 모든 요소에 대해 복사 생성자를 호출합니다. 아래에 더 많은 설명이 있습니다.
back_inserter를 사용할 수 있지만 벡터 ( https://en.cppreference.com/w/cpp/iterator/back_insert_iterator ) 에서 push_back ()을 호출 합니다. emplace_back () 은 push_back ()을 사용할 때 임시 작성을 피하기 때문에 더 효율적 입니다. 사소하게 구성된 유형에는 문제가되지 않지만 사소하게 구성되지 않은 유형 (예 : std :: string)에 성능 영향을 미칩니다.
size 인수로 벡터를 구성하면 모든 요소가 기본적으로 생성됩니다 (아무것도하지 않음). 예를 들어 std :: copy ()를 사용하는 솔루션과 같습니다 .
마지막으로 vector :: assign () 메소드 또는 반복자 범위를 취하는 생성자는 세트 반복자 에서 std :: distance () (요소 수를 알기 위해)를 호출하기 때문에 좋은 옵션이 아닙니다 . 세트가 이진 검색 트리 데이터 구조이고 랜덤 액세스 반복자를 구현하지 않기 때문에 모든 세트 요소를 통해 원치 않는 추가 반복이 발생 합니다.
희망이 도움이됩니다.
back_inserter
사용할 필요 가 없는지에 대한 권위에 대한 참조를 추가하십시오
std::copy
빈 용기에 넣을 수 없습니다. 그렇게하려면 다음과 같이 insert_iterator를 사용해야합니다.
std::set<double> input;
input.insert(5);
input.insert(6);
std::vector<double> output;
std::copy(input.begin(), input.end(), inserter(output, output.begin()));
assign()
기능 도 있습니다 :output.assign(input.begin(), input.end());