2009-05-25 13 views
65

나는 이것이 간단한 질문이라고 생각한다. 나는 이런 식으로 뭔가를 할 필요가 : 더 push_back이 없기 때문에std :: back_inserter for std :: set?

물론
std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); 

, std::back_inserter이 작동하지 않습니다. std::inserter도 반복기가 필요합니까? std::inserter을 사용하지 않았으므로 어떻게해야할지 모르겠습니다.

누구나 아이디어가 있습니까? 물론


내 다른 옵션은 s2에 대한 벡터를 사용하는 것입니다, 그리고 단지 나중에 정렬합니다. 어쩌면 좋을까요?

답변

98

set 요소의 위치는 집합의 비교기에 의해 결정되므로 push_back이 없습니다. std::inserter를 사용하고 그것을 .begin()를 전달합니다을 쓸 때 x 반복자에 전달 된 값입니다

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
transform(s1.begin(), s1.end(), 
      std::inserter(s2, s2.begin()), ExcitingUnaryFunctor()); 

삽입 반복자는 다음 s2.insert(s2.begin(), x)를 호출합니다. 세트는 반복기를 삽입 할 힌트로 사용합니다. s2.end()을 잘 사용할 수 있습니다.

+0

std :: map에서도 작동합니다 (시간을 저장 했으므로, 감사합니다). – FreeNickname

+1

'inserter (vec, vec.end())는 벡터에서도 작동하기 때문에, 왜 처음부터 back_inserter를 사용합니까? – NHDaly

+5

@NHDaly : back_inserter가 빠르기 때문에 – marton78

관련 문제