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


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



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

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


метода l i s t : : r e v e r s e ()



  1. ункция-член r e v e r s e () класса l i s t не получает никаких параметров и обращает порядок содержимого списка:



listlntegers.reverse(); // обратить порядок элементов

Применение метода r e v e r s e () приведено в листинге 18.5.


ЛИСТИНГ 18.5. Обращение элементов списка





  1. #include




  1. #include

  2. using namespace std;


  3. template




  1. void DisplayContents(const T& Input)

  2. {

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




  1. ; iElement != Input.cend()




  1. ; ++ iElement )




  1. cout « *iElement « '





  1. cout « endl;




  1. }








  1. int main()




  1. {




  1. std::list listlntegers;








  1. // Вставка элементов в начало и в конец




  1. listlntegers.push_front(4);




  1. listlntegers.push_front(3);




  1. listlntegers.push_front(2);

  2. listlntegers.push_front(1);




  1. listlntegers.push_front(0);




  1. listlntegers.push_back(5);



26



  1. cout « "Initial contents of the list:" « endl;




  1. DisplayContents(listlntegers);



29



  1. listlntegers.reverse();








  1. cout « "Contents of the list after using reverse():" « endl;




  1. DisplayContents(listlntegers);








  1. return 0;




  1. }

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

433



Результат


Initial contents of the list:


012345


Contents of the list after using reverse():


5 43210


Анализ

Как показано в строке 30, метод r e v e r s e () просто обращает порядок элементов спис­ ка. Это простой вызов без параметров, гарантирующий, что указывающие на элементы итераторы, если они были сохранены, останутся допустимыми.




Сортировка элементов

Функция-член s o r t () класса l i s t не доступна в версии без параметров:




listlntegers.sort(); // сортировеа в порядке возрастания

Другая версия позволяет определять собственные приоритеты сортировки при помощи функции предиката, переданной как параметр:


bool SortPredicate_Descending (const int& lsh, const int& rsh)

{


  1. определение критериев для метода list::sort: возвратить true




  1. для желательного порядка



return (lsh > rsh);

}


  1. Использование предиката для сортировки списка: listlntegers.sort (SortPredicate_Descending);

Эти два варианта представлены в листинге 18.6.




ЛИСТИНГ 18.6. Сортировка списка целых чисел по возрастанию



  1. по убыванию с использованием метода list:: sort ()_____________ __________________




    1. #include




    1. #include




    1. using namespace std;



3:



  1. bool SortPredicate_Descending (const int& lsh, const int& rsh)




  1. {




  1. // определение критериев для метода list::sort: возвратить true // для желательного порядка




  1. return (lsh > rsh);



8 : }
9:



  1. template




  1. void DisplayContents (const T& Input)

12: {

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




  1. ; iElement != Input.cend()




  1. ; ++ iElement )




  1. cout « *iElement « » i .






17:

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



  1. cout « endl;




  1. }

2 0 :



  1. int main ()



22: {

  1. list listlntegers;








  1. // Вставка элементов в начало и конец




  1. listlntegers.push_front (444);




  1. listlntegers.push_front (2011);




  1. listlntegers.push_front (-1);




  1. listlntegers.push_front (0);




  1. listlntegers.push_back (-5);



31:



  1. cout « "Initial contents of the list are - " « endl;




  1. DisplayContents (listlntegers);



34:



  1. listlntegers.sort ();








  1. cout « "Order of elements after sort():" « endl;




  1. DisplayContents (listlntegers);



39:



  1. listlntegers.sort (SortPredicate_Descending);



41: cout « "Order of elements after sort() with a predicate:



      1. endl;




    1. DisplayContents (listlntegers);








    1. return 0;




    1. }



Результат


Initial contents of the list are -


0 -1 2011 444 -5


Order of elements after sort():


-5 -1 0 444 2011


Order of elements after sort() with a predicate:


2011 444 0 -1 -5


Анализ

Данный пример демонстрирует функциональные возможности сортировки в спи­ ске целых чисел. В нескольких первых строках кода создается объект списка и запол­ няется примерами значений. Строка 35 демонстрирует применение функции s o r t () без параметров, что по умолчанию означает сортировку элементов в порядке возрастания: для сравнения целых чисел используется оператор < (который в случае целых чисел реа­ лизуется компилятором). Но если разработчик захочет переопределить это стандартное поведение, он должен снабдить функцию сортировки бинарным предикатом. Функция S o r t P r e d i c a t e D e sc e n d in g (), определенная в строках 4 -8, является бинарным преди­ катом, который позволяет функции s o r t () списка решить, является ли один элемент мень­ ше другого. В противном случае он меняет их позиции. Другими словами, вы указываете списку, что следует интерпретировать как “меньше” (в данном случае первый параметр



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

435

больше второго). Этот предикат передается как параметр функции s o r t () (строка 40). Предикат возвращает значение t r u e , только если первое значение больше второго. Таким образом, использующая предикат функция s o r t () интерпретирует первое значение ( ls h ) как логически меньшее второго (rsh ), только если числовое значение первого больше вто­ рого. На основе этой интерпретации, согласно определенному предикатом критерию, она меняет позицию элементов.


Сортировка и удаление элементов из списка, который содержит объекты класса

Что, если у вас есть список объектов класса, а не таких простых встроенных типов, как i n t ? Скажем, список записей адресной книги, где каждая запись — объект класса, содержащий имя, адрес и т.д. Как удостовериться, что этот список будет отсортирован по имени?


Решение может иметь два варианта.





  1. Реализуйте в пределах класса, объекты которого содержат список, оператор <.




  1. Предоставьте некий бинарный предикат (binary predicate) — функцию, получающую на входе два значения и возвращающую логическое значение, указывающее, меньше ли первое значение второго.

Реальные приложения, задействую щие контейнеры библиотеки STL, редко хранят целые числа; как правило, это пользовательские типы, такие как классы или структуры. Листинг 18.7 демонстрирует пример списка контактов. На первый взгляд он кажется до­ вольно длинным, но содержит главным образом простой код.





  1. ИСТИН Г 1 8 .7 . Список объектов класса: создание списка контактов_________________________





    1. Download 1,38 Mb.

      Do'stlaringiz bilan baham:
1   ...   304   305   306   307   308   309   310   311   ...   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