2011-11-05 2 views
1

세트 따라서 정렬 uniqued대로 내가 그들을 사용하는 두STL의 set_union

list<int> a (4,100); 
list<int> b (4,200); 

가 다음처럼 이제

a.sort(); 
a.unique(); 
b.sort(); 
b.unique(); 

두 목록 :

a: 100 
b: 200 

이제 조합을 계산합니다.

list <int> c(a.size() + b.size()); 
set_union(a.begin(), a.end(), b.begin(), b.end(), c.begin()); 

결과는 좋지만 두 목록을 다른 목록에 복사하지 않는 것이 좋습니다. 목록이 매우 커야하고 실제 정보를 포함하지 않기 때문입니다.

set_union(a.begin(), a.end(), b.begin(), b.end(), a.begin()); 

큰 복사본을 calulating없이 내가 실제로 결과가 될 싶은 로봇을 작동하고

a = c; 

aftterwards하지 않습니다. 또 다른 문제는 a = b = {100}이면 결과 c는 {100, 0}입니다!

아이디어가 있으십니까?

+1

처럼 빠르게 끌 수있는 실제 데이터에 따라 list::merge

std::list<int> a, b; a.sort(); a.unique(); b.sort(); b.unique(); a.merge(b); a.unique(); 

을 원하는 생각합니다. 실제 '세트'는 무엇일까? –

답변

3

std::set_difference 다음에 list::merge으로 복사를 최소화 할 수 있습니다. 둘 다 선형 연산입니다.

std::list<int> a, b, c; 

std::set_difference(b.begin(), b.end(), a.begin(), a.end(), back_inserter(c)); 
a.merge(c); 

b 목록

수정되지 않고 임시 c 목록이 비어 있습니다.

+0

자세한 내용과 정확함 +1 – sehe

2

난 당신이 단순히 같은 list` 거의 확실 나쁜 잘못 '사용이

a.sort(); 
b.sort(); 
a.merge(b); 
a.unique(); 
+0

각 목록을 "정렬"및 "고유"d 별도로 있기 때문에 이후에 병합한다고해서 병합 된 목록이 정렬되거나 고유하다는 것을 보증하지는 않습니다. 병합 된 목록에는 추가 "정렬"및 "고유"가 필요할 수 있습니다. –

+0

@SionSheevok 글쎄, 당신은 ** 부분적으로 ** 맞습니다. 결과가 정렬되도록 보장합니다. '유일한'여전히 필요합니다. 나는 OP의 요구 사항을 실제로 들여다 볼 수는 없지만 그것을 추가 할 것이다. Blastfurnace의 대답 – sehe

+0

으로 나의 +1을 주목하라'b'를 공백으로 남겨두면 두 번째 코드 스 니펫은 아마도'std :: list'를위한 가장 빠른 해결책 일 것입니다. – Blastfurnace

관련 문제