C++ за 21 день седьмое издание



Download 1,38 Mb.
bet309/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   305   306   307   308   309   310   311   312   ...   437
Bog'liq
word1

#include




    1. #include




    1. #include




    1. using namespace std;



4:



  1. template




  1. void DisplayContents (const T& Input)




  1. {




  1. for(auto iElement = Input.cbegin() // auto, cbegin и cend: C++11




  1. ; iElement != Input.cend()




  1. ; ++ iElement )



11: cout « *iElement « endl;
1 2 :

  1. cout « endl;




  1. }



15:



  1. struct Contactltem




  1. {




  1. string strContactsName;




  1. string strPhoneNumber;




  1. string strDisplayRepresentation;



2 1 :



22: // Конструктор и деструктор

436 ЗАНЯТИЕ 18. Классы двухсвязного и односвязного списков библиотеки STL



  1. Contactltem (const strings strName, const string & strNumber)




  1. {




  1. strContactsName = strName; '




  1. strPhoneNumber = strNumber;




  1. strDisplayRepresentation = (strContactsName + ": "\




    1. strPhoneNumber);




  1. }



29:



  1. // используется list::remove() для элемента списка контактов




  1. bool operator == (const ContactltemS itemToCompare) const




  1. {




  1. return (itemToCompare.strContactsName == \



this->strContactsName);



  1. }








  1. // используется в list::sort() без параметров




  1. bool operator < (const Contactltems itemToCompare) const




  1. {




  1. return (this->strContactsName < \ itemToCompare.strContactsName);



40:


41:


42:


43:


44:


45:


46:



  1. };







}



  1. Используется в DisplayContents через cout operator const char*() const



{


return strDisplayRepresentation.c_str();

}




49: bool SortOnPhoneNumber (const ContactltemS iteml,


50: const ContactltemS item2)



  1. {




  1. return (iteml.strPhoneNumber < item2.strPhoneNumber);




  1. }



54:



  1. int main ()




  1. {




  1. list Contacts;




  1. Contacts.push_back(Contactltem("Jack Welsch",



"+1 7889 879 879"));



  1. Contacts.push_back(Contactltem("Bill Gates",



"+1 97 7897 8799 8"));



  1. Contacts.push_back(Contactltem("Angela Merkel", "+49 23456 5466"));

  2. Contacts.push_back(Contactltem("Vladimir Putin",



"+7 6645 4564 797"));



  1. Contacts.push_back(Contactltem("Manmohan Singh", "+91 234 4564 789"));




  1. Contacts.push_back(Contactltem("Barack Obama",



"+1 745 641 314"));


64:



  1. cout « "List in initial order: " « endl;




  1. DisplayContents(Contacts);

Обращение списка и сортировка его элементов

437



57:



  1. Contacts.sort ();



69: cout « "After sorting in alphabetical order via operator<:"



    1. endl;




  1. DisplayContents(Contacts);







"2:Contacts.sort(SortOnPhoneNumber);


"З: cout « "After sorting in order of phone numbers via predicate:"



  1. endl;



^4: DisplayContents(Contacts);
75 :


76: cout « "After erasing Putin from the list: ";



  1. Contacts.remove(Contactltem("Vladimir Putin", ""));




  1. DisplayContents(Contacts);



79:



  1. return 0;




  1. }



Результат


List in initial order:


Jack Welsch: +1 7889 879 879


Bill Gates: +1 97 7897 8799 8


Angela Merkel: +49 23456 5466


Vladimir Putin: +7 6645 4564 797


Manmohan Singh: +91 234 4564 789


Barack Obama: +1 745 641 314


After sorting in alphabetical order via operatorC 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


After sorting in order of phone numbers via predicate:


Barack Obama: +1 745 641 314


Jack Welsch: +1 7889 879 879


Bill Gates: +1 97 7897 8799 8


Angela Merkel: +49 23456 5466


Vladimir Putin: +7 6645 4564 797


Manmohan Singh: +91 234 4564 789


After erasing Putin from the list:


Barack Obama: +1 745 641 314


Jack Welsch: +1 7889 879 879


Bill Gates: +1 97 7897 8799 8


Angela Merkel: +49 23456 5466


Manmohan Singh: +91 234 4564 789

  1. ЗАНЯТИЕ 18. Классы двухсвязного иодносвязного списков библиотеки STL



Анализ

Сначала сосредоточимся на строках 57-81 функции m a in () . В строке 57 создается экземпляр списка элементов книги адресов типа C o n t a c t lt e m . В строках 58-63 этот спи­ сок заполняется вымышленными номерами телефонов и именами нескольких знаменито­ стей и политических деятелей. В строке 66 осуществляется вывод этого списка на экран. Функция l i s t : : s o r t без предиката используется в строке 68. При отсутствии предиката эта функция сортировки ищет оператор o p e r a t o r < в классе C o n t a c t lt e m , где он и был определен в строках 37 -40 . Оператор C o n t a c t lt e m : : o p e r a t o r < позволяет контейне­ ру l i s t : : s o r t сортировать свои элементы в алфавитном порядке хранимых имен (а не номеров телефонов или произвольно). Чтобы отсортировать тот же список по номерам телефонов, используйте функцию l i s t : : s o r t ( ) , предоставив ей как аргумент бинарный предикат S o rtO n P h o n e N u m b e r () (строка 72). Эта функция, реализованная в строках 49-53, гарантирует, что входные аргументы типа C o n t a c t lt e m сравниваются с другими по номеру телефона, а не по имени. Таким образом, это позволяет функции l i s t :: s o r t () сортировать список знаменитостей на основе их номеров телефонов, как свидетельству­ ет вывод. И наконец, в строке 77 используется метод l i s t : : re m o v e () для удаления контакта из списка. Объект контакта передается как параметр. Метод l i s t : : re m o v e () сравнивает этот объект с другими элементами списка с использованием оператора C o n t a c t lt e m : : o p e r a t o r s реализованного в строках 30-34. Этот оператор возвращает значение t r u e , если имена совпадают, предоставляя методу l i s t : : re m o v e () критерий для принятия решения о соответствии.


Данный пример демонстрирует не только применение шаблона связанного списка би­ блиотеки STL для создания списка объектов любого типа, но и важность операторов, пре­ дикатов.
С++11


Шаблон класса std :: forward_list



  1. языке C + + 11 появилась возможность использовать класс s t d : : f o r w a r d _ li s t вме­ сто двухсвязного списка класса s t d : : l i s t . Класс s t d : : f o r w a r d _ l i s t предоставляет односвязный список, допускающий перебор только в одном направлении (рис. 18.2).




Данные

Связь со (

Данные

Связь со

^

Данные

Связь со

следующим

следующим




следующим



















Узел 1

Узел 2

-

Узел N







РИС. 18.2. Визуальное представление односвязного списка

СОВЕТ




Для использования шаблона класса std: :forw ard _ list необходимо вклю­

чить заголовок :


#include



Обращение списка и сортировка его элементов

439

Класс f o r w a r d _ l i s t используется очень похоже на класс l i s t , но перемещ ение итераторов возможно только в одном направлении. Для вставки элементов есть функция p u s h _ f r o n t (), но нет функции p u s h _ b a c k (). Конечно, вы всегда можете использо­ вать функцию i n s e r t () и ее перегруженные версии для вставки элементов в указанную позицию.


В листинге 18.8 показаны некоторые функции класса f o r w a r d _ l i s t .





  1. И СТИ Н Г 1 8 .8 . Простые операции вставки и извлечения из односвязного списка____________




    1. #include




    1. #include




    1. using namespace std;



3:



  1. template




  1. void DisplayContents (const T& Input)



6 : {



  1. for (auto iElement = Input.cbegin() // auto и cbegin: C++11




  1. ; iElement != Input.cend ()




  1. ; ++ iElement )



10: cout << *iElement « '
1 1 :

  1. cout « endl;




  1. }



14:



  1. int main()




  1. {




  1. forward_list flistlntegers;




  1. flistIntegers.push_front(0);




  1. flistlntegers.push_front(2);




  1. flistlntegers.push_front(2);




  1. flistlntegers.push_front(4);




  1. flistlntegers.push_front(3);




  1. flistlntegers.push_front(1);



24:



  1. cout « "Contents of forward_list:" « endl;




  1. DisplayContents(flistlntegers);



27:



  1. flistlntegers.remove(2);




  1. flistlntegers.sort() ;




  1. cout « "Contents after removing 2 and sorting: " « endl;




  1. DisplayContents(flistlntegers);



32:



  1. return 0;




  1. }



Результат


Contents of forward_list:


134220


Contents after removing 2 and sorting:


013 4
[40 ЗАНЯТИЕ 18. Классы двухсвязного иодносвязного списков библиотеки STL


Анализ

Как видно из примера, функционально класс f o r w a r d l i s t весьма похож на класс i s t . Поскольку класс fo rw a rd l i s t не поддерживает двунаправленный перебор, вы мо-сете использовать для итератора оператор o p e ra to r+ + , но не оператор o p e r a t o r — . Этот [ример демонстрирует применение функции rem ove (2) для удаления всех элементов со начением 2 (строка 28). Строка 29 демонстрирует функцию s o r t () для сортировки с ис-юльзованием предиката по умолчанию s t d : : le ss< T > .


Преимущество класса f o r w a r d l i s t заключается в том, что это односвязный список,





    1. использует меньше памяти, чем класс l i s t (поскольку элемент содержит ссылку толь-




  1. на следующий элемент, но не на предыдущий).






РЕКОМЕНДУЕТСЯ

Используйте класс s t d : : l i s t вместо класса


s t d : :v ec to r, когда необходимо частое уда­ ление и вставка элементов, особенно в середи­ ну, поскольку вектор должен изменять размеры своего внутреннего буфера для обеспечения семантики, как у массива, что вызывает про­ должительные операции копирования, а список только привязывает или отцепляет элементы


Помните, что методы p u sh ^ fro n t О и push_ back {} позволяют вставлять элементы в нача­ ло и в конец списка соответственно


Помните о необходимости реализовать опе­ раторы o p era to r< и o p e r a to r - - в клас­ се, объекты которого будут храниться в таком контейнере STL, как l i s t , чтобы предоставить предикат по умолчанию для сортировки и уда­ ления


Помните, что вы всегда можете определить ко­ личество элементов в списке, используя метод l i s t " : : s iz e (), как и в любом другом контей­ нере библиотеки STL


Помните, что вы можете освободить список, ис­ пользуя метод l i s t :: c le a r (), как и в любом другом контейнере библиотеки STL



Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   305   306   307   308   309   310   311   312   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish