이것은 간단한 질문이라고 생각합니다. 다음과 같이해야합니다.
std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
물론, std::back_inserter
어떤이 이후 작업은하지하지 않습니다 push_back
.
std::inserter
반복자가 필요합니까? 사용 std::inserter
하지 않아서 어떻게해야할지 모르겠습니다.
누구 아이디어가 있습니까?
물론 내 다른 옵션은에 벡터를 사용한 s2
다음 나중에 정렬하는 것입니다. 그게 더 좋을까요?
답변
set
push_back
요소의 위치는 세트의 비교기에 의해 결정되기 때문에 없습니다 . std::inserter
그것을 사용 하고 전달하십시오 .begin()
:
std::set<int> s1, s2;
s1 = getAnExcitingSet();
transform(s1.begin(), s1.end(),
std::inserter(s2, s2.begin()), ExcitingUnaryFunctor());
그런 다음 삽입 반복기는 기록 될 때 반복기에 전달 된 값이 s2.insert(s2.begin(), x)
어디에 있는지 호출 x
합니다. 이 세트는 삽입 할 위치 힌트로 반복기를 사용합니다. 당신은 잘 사용할 수 있습니다 s2.end()
.
답변
2016 년에는 “단일 인수 inserter
반복자”를 제안했습니다 .
https://isocpp.org/files/papers/p0471r0.html . 제안이 진행되었는지 알 수 없었습니다. 말이되는 것 같아요.
지금은 maker 함수를 정의하는이 동작을 가질 수 있습니다.
template<class Container>
auto sinserter(Container& c){
using std::end;
return std::inserter(c, end(c));
}
다음으로 사용 :
std::transform(begin(my_vec), end(my_vec), sinserter(my_set), [](auto& e){return e.member;});