2010-09-14 1 views
1

Учитывая приведенный ниже сценарий, у меня есть список предметов, которые могут иметь некоторый дублированный элемент. Я хотел бы отфильтровать элемент, чтобы напечатать единственный уникальный элемент.Как реализовать std :: set или std :: hash_set для фильтрации дублированного элемента в списке массивов?

Вместо дублирования списка, который удаляет дублированный элемент, я попытался вставить их в std :: set и std :: hash_set. Тем не менее, я не нашел полезного примера для выполнения операции.

Поэтому я надеюсь, что искать Ваш совет по следующему коду:

#include <list> 
//--> A struct to store software name and version 
typedef struct tagSWVERStruct{ 
    TCHAR szSWName[255]; 
    TCHAR szVersion[255]; 
}SWVERSIONSTRUCT, *LPSWVERSIONSTRUCT; 

//--> A list of struct to store software name and version 
typedef std::list<SWVERSIONSTRUCT> LISTSWVERSION, *PLISTSWVERSION; 

void main() 
{ 
    LISTSWVERSION swList; 
    SWVERSIONSTRUCT svSW1, svSW2, svSW3, svSW4; 
    CString szVersion, szName; 

    //Assign value 
    _tcscpy_s(svSW1.szSWName, _T("Adapter 1")); 
    _tcscpy_s(svSW2.szSWName, _T("Adapter 2")); 
    _tcscpy_s(svSW3.szSWName, _T("Adapter 1")); 
    _tcscpy_s(svSW4.szSWName, _T("Adapter 3")); 
    _tcscpy_s(svSW1.szVersion, _T("1.0.0")); 
    _tcscpy_s(svSW2.szVersion, _T("2.0.0")); 
    _tcscpy_s(svSW3.szVersion, _T("1.0.0")); 
    _tcscpy_s(svSW4.szVersion, _T("3.0.0")); 
    swList.push_back(svSW1); 
    swList.push_back(svSW2); 
    swList.push_back(svSW3); 
    swList.push_back(svSW4); 

    //print all the item out 
    LISTSWVERSION::iterator it = swList.begin(); 
    for(; it!=swList.end(); ++it){  
    _tprintf(_T("%s version = %s\n"), (*it).szSWName, (*it).szVersion); 
    } 
} 

/******* 
Output: 
Adapter 1 version = 1.0.0 
Adapter 2 version = 2.0.0 
Adapter 1 version = 1.0.0 
Adapter 3 version = 3.0.0 

Expected Output: 
Adapter 1 version = 1.0.0 
Adapter 2 version = 2.0.0 
Adapter 3 version = 3.0.0 
********/ 
+1

eh? вы не используете std :: set на всех –

+1

замените 'std :: list'' 'std :: set' и' push_back' на 'insert', и вам хорошо идти. См. Ответ dauphic. – rubenvb

+0

** hash_set **: http://www.sgi.com/tech/stl/hash_set.html/ ** комплект **: http://www.sgi.com/tech/stl/set.html – log0

ответ

0

Удаление дубликатов легко, если вы можете изменить последовательность.

Сначала вам нужно будет меньше, чем и равенство функторов:

struct less_SWVERSIONSTRUCT 
{ 
    bool operator() (SWVERSIONSTRUCT const & a, SWVERSIONSTRUCT const & b) const 
    { 
    // Replace this with the appropriate less-than relation for the structure. 
    return std::memcmp (&a, &b, sizeof (a)) < 0; 
    } 
}; 

struct eq_SWVERSIONSTRUCT 
{ 
    bool operator() (SWVERSIONSTRUCT const & a, SWVERSIONSTRUCT const & b) const 
    { 
    // Replace this with the appropriate equality relation for the structure. 
    return std::memcmp (&a, &b, sizeof (a)) == 0; 
    } 
}; 

Затем сортировать список с помощью компаратора:

swList.sort (less_SWVERSIONSTRUCT()); 

И теперь удалить последовательности повторяющихся элементов:

swList.erase (
    std::unique (swList.begin(), swList.end(), eq_SWVERSIONSTRUCT()), 
    swList.end()); 

Готово.

+0

Спасибо за ваш совет. – wengseng

+0

Работает по следующему коду: – wengseng

+0

swList.sort (LESS_SWVERSIONSTRUCT()); \t swList.unique (EQ_SWVERSIONSTRUCT()); – wengseng

1

не может быть понимание, но если вы хотите, чтобы скопировать элементы в std::list в std::set, вы можете использовать std::copy с a inserter.

std::list<int> list; 
list.push_back(1); 
list.push_back(2); 
list.push_back(2); 
list.push_back(3); 

std::set<int> set; 
std::copy(list.begin(), list.end(), std::inserter(set)); 
+1

Этот код предполагает, что список уже отсортирован, что не относится к вводу, предоставленному в вопросе. – wilx

+0

Спасибо, я упустил «уникальный», требующий сортированного контейнера. –

+0

Это должно быть 'std :: inserter (set, set.end())' (итератор не имеет значения для 'set :: insert()' correctness, это просто подсказка производительности; end() работает лучше, если данные сортируются). Увы, это не работает для hash_set, потому что 'hash_set :: insert()' не принимает второй аргумент итератора where-to-insert. –