; iElement != Input.cend () // cend(): C++11
; ++ iElement )
11: cout « *iElement « endl;
1 2 :
Простые операции с классами set и multiset библиотеки STL
cout « endl;
}
15:
struct Contactltem
{
string strContactsName;
string strPhoneNumber;
string strDisplayRepresentation;
2 1 :
// Конструктор и деструктор
Contactltem (const strings strName, const string & strNumber)
{
strContactsName = strName;
strPhoneNumber = strNumber;
strDisplayRepresentation = (strContactsName + ": " \
strPhoneNumber);
}
29:
// используется в set::find()
bool operator == (const ContactltemS itemToCompare) const
{
33:
|
return (itemToCompare.strContactsName == \
|
|
this->strContactsName);
|
}
// используется как предикат сортировки
bool operator < (const ContactltemS itemToCompare) const
{
return (this->strContactsName \
itemToCompare.strContactsName);
}
41:
// Используется в DisplayContents для cout
operator const char*() const
{
return strDisplayRepresentation.c_str();
}
};
48:
int main ()
{
set setContacts;
setContacts.insert(Contactltem("Jack Welsch",
"+1 7889 879 879"));
setContacts.insert(Contactltem("Bill Gates",
"+1 97 7897 8799 8"));
setContacts.insert(Contactltem("Angela Merkel", "+49 23456 5466"));
setContacts.insert(Contactltem("Vladimir Putin",
"+7 6645 4564 797"));
setContacts.insert(Contactltem("Manmohan Singh",
"+91 234 4564 789"));
5 7 : setContacts.insert(Contactltem("Barack Obama", "+1 745 641 314"));
454 ЗАНЯТИЕ 19. Классы наборов библиотеки STL
DisplayContents(setContacts);
cout « "Enter a person whose number you wish to delete: ";
string Namelnput;
getline(cin, Namelnput);
63:
auto iContactFound = setContacts.find(Contactltem(Namelnput,
if(iContactFound != setContacts.end())
66: {
// Удалить контакт, найденный в наборе
setContacts.erase(iContactFound);
69: cout « "Displaying contents after erasing: " « Namelnput
endl;
DisplayContents(setContacts);
}
else
cout « "Contact not found" « endl;
return 0;
}
Результат
Angela Merkel: +49 23456 5466
Barack Obama: +1 745 641 314
Bill Gates: +1 97 7897 8799 8
Jack Welsch: +1 7889 879 879
Manmohan Singh: +91 234 4564 789
Vladimir Putin: +7 6645 4564 797
Enter a person whose number you wish to delete: Jack Welsch
Displaying contents after erasing: Jack Welsch
Angela Merkel: +49 23456 5466
Barack Obama: +1 745 641 314
Bill Gates: +1 97 7897 8799 8
Manmohan Singh: +91 234 4564 789
Vladimir Putin: +7 6645 4564 797
Анализ
Это очень похоже на листинг 18.7, где список был отсортирован в алфавитном порядке, но в данном случае сортировка набора осущ ествляется по вставке. Как демонстрирует вывод, не нужно вызывать никаких функций, чтобы гарантировать сортировку элементов
наборе, поскольку они сортируются на вставке. Вы позволяете пользователю удалить запись, и в строке 64 демонстрируется вызов функции f i n d (), позволяющей найти ту за пись, которая удаляется в строке 68 при помощи метода e r a s e ().
Преимущества и недостатки использования наборов и мультимножеств
|
455
|
Эта реализация телефонного справочника основана на классе set библиотеки STL, а потому она не позволяет содержать несколько записей с одинаковым зна чением. Если необходима реализация справочника, позволяющая хранить две записи с одинаковым именем (скажем, Том), то выбирайте класс multiset библиотеки STL. Если контейнер setContacts станет мультимножеством, то приведенный выше код продолжит работать правильно. Чтобы развить возмож ность мультимножества хранить несколько записей с одинаковым значением, используйте функцию-член count (), чтобы знать количество элементов, со держащих определенное значение. Это представлено в предыдущем примере кода. Подобные элементы помещаются в мультимножестве рядом, и функция find () возвращает итератор первого найденного значения. Приращение этого итератора позволит обратиться к следующим найденным элементам.
Do'stlaringiz bilan baham: |