2010-06-09 5 views
0

두 세트를 비교하고 누락 된 요소를 첫 번째 세트를 반복하여 두 번째 세트에 표시하려고합니다.목록 비교/세트 요소

목록을 사용했는데 요소를 찾기 위해 순서가 지정되지 않은 목록을 반복하는 오버 헤드처럼 보입니다.

#include <iostream> 
#include <list> 
using std::list; 

bool isExist(list <int> &original, int i) 
{ 
list <int>::iterator iter; 

for (iter = original.begin(); iter != original.end(); iter++) 
{ 
    if (*iter == i) { 
    original.splice(original.end(), original, iter); 
    return true; } 
} 
return false; 
} 

void FindMissing(list <int> &original, list <int> &missing) 
{ 
int count_exist = 0; 

list <int>::iterator iter; 

for (iter = missing.begin(); iter != missing.end(); iter++) 
{if (isExist(original, *iter)) 
    count_exist++;} 

int count_missing = original.size() - count_exist; 

iter = original.begin(); 

while(count_missing > 0) 
{ 
    std::cout << *iter++ << std::endl; 
    count_missing--; 
} 
} 

int main() 
{ 
list <int> list_data_1; 
list <int> list_data_2; 

//Fill the list. 
for (int i = 0; i < 5; i++) 
list_data_1.push_back(i); 

//Fill second list with missing elements. 
list_data_2.push_back(3); 
list_data_2.push_back(1); 
list_data_2.push_back(4); 

FindMissing(list_data_1, list_data_2); 
} 

어떻게 설정하면 되겠습니까? 이 두 가지 경우

답변

9

:

std::set<int> s1; 
std::set<int> s2; 

을하고 다른 하나도에 있지만 요소의 집합을 얻으려면, 당신은 std::set_difference 사용할 수 있습니다

std::set<int> difference; 
std::set_difference(s1.begin(), s1.end(), 
        s2.begin(), s2.end(), 
        std::inserter(difference, difference.begin())); 

difference하는 것이 포함됩니다 s1에 있지만, s2에는없는 모든 요소

std::set_difference은 두 개의 정렬 된 범위에서 작동하므로 다른 컨테이너에서도 사용할 수 있습니다 (예 : std::list이 정렬 된 경우 std::set_difference을 사용하여 차이를 찾을 수 있음).

+0

Dang, 나에게 이길. 좋은 설명. –