2015-12-11 9 views
2

Я хочу объединить два списка, чтобы в объединенной очереди присутствовала только одна запись общего элемента.Объединить два списка C++

std::list<int> list1 = { 5,9,0,1,3,4 }; 
std::list<int> list2 = { 8,7,2,6,4 }; 
list1.sort(); 
list2.sort(); 
std::cout << "list1: " << list1 << "\n"; 
std::cout << "list2: " << list2 << "\n"; 
list1.merge(list2); 
std::cout << "merged: " << list1 << "\n"; 

Выход выглядит следующим образом:

list1: 0 1 3 4 5 9 
list2: 2 4 6 7 8 
merged: 0 1 2 3 4 4 5 6 7 8 9 

Я хочу, чтобы выход выглядеть следующим образом:

list1: 0 1 3 4 5 9 
list2: 2 4 6 7 8 
merged: 0 1 2 3 4 5 6 7 8 9 
+4

Использовать [std :: unique] (http://www.cplusplus.com/reference/algorithm/unique/)? – nwp

ответ

5
list1.sort(); 
list1.unique(); 

поскольку ваш список отсортирован просто позвоните unique

list1.unique(); 

ваш полный код:

std::list<int> list1 = { 5,9,0,1,3,4 }; 
std::list<int> list2 = { 8,7,2,6,4 }; 
list1.sort(); 
list2.sort(); 
std::cout << "list1: " << list1 << "\n"; 
std::cout << "list2: " << list2 << "\n"; 
list1.merge(list2); 
list1.unique(); 
std::cout << "merged: " << list1 << "\n"; 
1

Else, вы можете использовать std::set сохранить коллекцию уникальных данных. Вот как я модом код:

std::list<int> list1 = { 5,9,0,1,3,4 }; 
    std::list<int> list2 = { 8,7,2,6,4 }; 

    std::set<int> unq(list1.begin(),list1.end()); //initialize with list 1 
    unq.insert(list2.begin(),list2.end()); //now insert list 2 completely 

    //Print new data 

    for(std::set<int>::iterator it=unq.begin();it!=unq.end();it++) 
    cout<<*it<<" "; 
+1

Если вы вообще хотите использовать 'std :: set', вы можете перегрузить конструктор и' insert' to ** избегать ручных циклов **: 'std :: set unq (list1.begin(), list1.end()) ;, а затем добавьте второй список как: 'unq.insert (list2.begin(), list2.end());'. Достаточно двух строк. – Nawaz

+0

Спасибо. Я внес изменения – bholagabbar

5

Я не любитель больших кодов:

std::list<int> list1 = { 5,9,0,1,3,4 }; 
std::list<int> list2 = { 8,7,2,6,4 }; 

list1.splice(list1.end(), list2); 
list1.sort(); 
list1.unique(); 

list1 теперь содержит одну копию каждого элемента из исходного list1 и list2. Первый шаг передает содержимое list2 в list1. Второй шаг сортирует элементы. На последнем этапе выбрасываются дубликаты. При сортировке списков по отдельности и последующем слиянии мало пользы.

Смежные вопросы