카테고리 보관물: c++

c++

std :: set에 대한 std :: back_inserter? push_back. std::inserter반복자가 필요합니까? 사용 std::inserter하지 않아서 어떻게해야할지

이것은 간단한 질문이라고 생각합니다. 다음과 같이해야합니다.

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다음 나중에 정렬하는 것입니다. 그게 더 좋을까요?



답변

setpush_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;});


답변