2010-06-09 134 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

當,打我吧。很好的解釋。 – 2010-06-09 01:49:36