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


// начало исходного диапазона 1



Download 1,38 Mb.
bet367/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   363   364   365   366   367   368   369   370   ...   437
Bog'liq
word1

// начало исходного диапазона 1

, veclntegersl.end ()

()

//

конец исходного диапазона 1

, veclntegers2.begin

// начало исходного диапазона 2

, dqResultAddition.begin

//

сохранить результат в

, plus () );




// двухсторонней очереди




//

бинарная функция plus

Обе версии алгоритма t r a n s f o r m

()

всегда присваиваю т результат определенной

функции преобразования предоставленному диапазону назначения, в отличие от алгорит­ ма f o r e a c h (), который воздействует только на один диапазон. Использование алгоритма s t d : : tr a n s f o r m () показано в листинге 23.7.




ЛИСТИНГ 23.7. Использование алгоритма std:: transform ()



  1. унарными и бинарными функциями______________________________________




    1. #include




    1. #include




    1. #include




    1. #include




    1. #include




    1. #include

  1. :




  1. int main ()



8 : {

  1. using namespace std;



1 0 :

  1. string Sample ("THIS is a TEststring!");




  1. cout « "The sample string is: " « Sample « endl;








  1. string strLowerCaseCopy;




  1. strLowerCaseCopy.resize (Sample.size ());

    16:

    transform ( Sample.begin ()

    //

    начало исходного диапазона

    17:

    18:

    , Sample.end ()

    //

    конец исходного диапазона

  2. , strLowerCaseCopy.begin () // начало диапазона

20:

, tolower );

//

назначения

//

унарная функция

2 1 :

22:

cout

«

"Result of 'transform' on the string with 'tolower':"

23:

cout

«

endl;

« endl « endl;

«

"\"" « strLowerCaseCopy «

24:













  1. // Два примера векторов целых чисел...




  1. vector veclntegersl, veclntegers2;




  1. for (int nNum = 0; nNum < 10; ++ nNum)




  1. {




  1. veclntegersl.push_back (nNum);




  1. veclntegers2.push_back (10 - nNum);




  1. }



32:


33: //Диапазонназначения для содержания результата сложения

530 ЗАНЯТИЕ 23. Алгоритмы библиотеки STL





  1. deque dqResultAddition (veclntegersl.size ());








  1. transform ( veclntegersl.begin () // начало исходного диапазона 1



37: , veclntegersl.end () // конец исходного диапазона 1



  1. , veclntegers2.begin () // начало исходного диапазона 2




  1. , dqResultAddition.begin () // начало диапазона

40:




, plus () );

//

назначения




//

бинарная функция

41:

cout «

"Result of 'transform' using binary function 'plus': "

42:




«

endl;







43: cout «endl « "Index Vectorl + Vector2 = Result (in Deque)"



    1. endl;




  1. for(size_t nlndex = 0; nlndex < veclntegersl.size (); ++ nlndex)




  1. {



46: cout « nlndex « " \t " « veclntegersl [nlndex] « "\t+



  1. cout « veclntegers2 [nlndex] « " \t =








  1. cout « dqResultAddition [nlndex] « endl;




  1. }



51:



  1. return 0;




  1. }



Результат


The sample string is: THIS is a TEst string!


Result of using 'transform' with unary function 'tolower' on the string:


"this is a test string!"


Result of 'transform' using binary function 'plus':

Index

Vectorl

+ Vector2> _ Resi

0

0

+

10

=

10

1

1

+

9

=

10

2

2

+

8

=

10

3

3

+

7

=

10

4

4

+

6

=

10

5

5

+

5

=

10

6

6

+

4

=

10

7

7

+

3

=

10

8

8

+

2

=

10

9

9

+

1

=

10



Анализ

Пример демонстрирует обе версии алгоритма s t d : : tr a n s f o r m (): ту, которая воздей­ ствует на один диапазон с использованием унарной функции to lo w e r (), как показано





  1. строке 20, и вторую, которая воздействует на два диапазона с использованием бинар­ ной функции p lu s (), как показано в строке 40. Первая версия посимвольно изменяет ре­

гистр символов строки на нижний. Если вместо функции to lo w e r () использовать функ­

цию to u p p e r (), строка будет переведена в верхний регистр. Другая версия алгоритма s t d : : t r a n s f o r m (), представленная в строках 36 -40, воздействует на элементы, взятые



Использование алгоритмов STL

531

из двух исходных диапазонов (в данном случае два вектора), и использует бинарный пре­ дикат в форме функции p lu s () библиотеки STL (определена в заголовке < f u n c tio n a l> ) для их суммирования. Функция s t d : : tr a n s f o r m () получает одну пару за один раз, пере­ давая их бинарной функции p lu s (), и присваивает результат элементу в диапазоне назна­ чения, который в данном случае принадлежит контейнеру класса s td :d e q u e . Обратите внимание, что результат в отдельном контейнере сохраняется в демонстрационных целях. Это показывает, насколько хорошо итераторы абстрагируют контейнеры и их реализацию от алгоритмов STL; функция t r a n s f o r m (), будучи алгоритмом, работает с диапазона­ ми и действительно не обязана знать подробности о контейнере, который реализует эти диапазоны. Так, исходные диапазоны могут быть в векторе, а диапазоны назначения —





  1. двухсторонней очереди, и все будет работать прекрасно, пока допустимы определяющие диапазон границы (предоставляемые как входные параметры функции tr a n s f o r m ()).



Операции копирования и удаления

Библиотека STL предоставляет три очевидных функции копирования: сору (), со р у _ i f () и co p y _ b a ck w a rd (). Функция со р у () способна присвоить содержимое исходного диапазона диапазону назначения в текущем порядке:





auto iLastPos = copy ( listlntegers.begin ()

// начало исходного

, listlntegers.end

()

// диапазона

//

конец исходного

, veclntegers.begin

() );

// диапазона

//

начало диапазона







//

назначения

Функция c o p y _ if () копирует элемент, только если предоставленный вами унарный предикат возвращает значение tr u e :





  1. скопировать нечетные числа из списка в вектор copy_if ( listlntegers.begin(), listlntegers.end()

    1. iLastPos




    1. [](int element){return ((element % 2) == 1);});




ПРИМЕЧАНИЕ


Начиная с версии C++11 алгоритм copy_if () находится в пространстве имен std. Если вы используете старый компилятор или несовместимый со стандар­ том C++И , с его использованием могут возникнуть проблемы.



Функция co p y


b a c k w a rd () присваивает содержимое диапазону назначения в обрат­



ном порядке:





copy_backward ( listlntegers.begin ()



      1. listlntegers.end ()




      1. veclntegers.end () );




  1. ункция rem o v e (), напротив, удаляет из контейнера элементы, соответствую щ ие определенному значению:




    1. Удалить все экземпляры '0' и изменить размер вектора,




    1. используя erase ()



auto iNewEnd = remove (veclntegers.begin (), veclntegers.end (), 0); veclntegers.erase (iNewEnd, veclntegers.end ());

532 ЗАНЯТИЕ 23- Алгоритмы библиотеки STL

Функция rem ove i f () использует унарный предикат и удаляет из контейнера те эле­ менты, для которых предикат возвращает значение tr u e :






  1. Download 1,38 Mb.

    Do'stlaringiz bilan baham:
1   ...   363   364   365   366   367   368   369   370   ...   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