cout
|
«
|
"Using
|
'std::replace_if' to replace even values by
|
-Iм
|
|
32:
|
|
33:
|
|
«
|
endl;
|
|
|
|
()
|
|
|
replace_if
|
(veclntegers.begin (), veclntegers.end
|
}, -1);
|
|
34:
|
|
|
,
|
[](int element)
|
{return ((element
|
% 2)
|
== 0);
|
|
35:
|
cout
|
«
|
endl «
|
"Contents of
|
the vector aftef
|
replacements:"
|
|
36:
|
|
endl;
DisplayContents(veclntegers);
return 0;
}
Результат
The initial contents of the vector are:
5 8 5 8 8 5 | Number of elements: 6
Using 'std::replace' to replace value 5 by 8
Using 'std::replace_if' to replace even values by -1
Contents of the vector after replacements:
-1 -1 -1 -1 -1 -1 | Number of elements: 6
Анализ
Код заполняет вектор v e c l n t e g e r s типа v e c to r < in t> примерами значений, а затем переупорядочивает его, используя алгоритм s t d : : ra n d o m _ sh u f f l e () библиотеки STL, как показано в строке 24. Строка 30 демонстрирует применение функции r e p la c e () для замены всех значений 5 и 8. В строке 33 функция r e p l a c e _ i f () заменяет все четные числа значением -1 . В результате получается, что у коллекции есть шесть элементов, со держащих идентичное значение -1 , как показано в выводе.
Сортировка, поиск в отсортированной коллекции и удаление дубликатов
Сортировка и поиск в отсортированном диапазоне (для повышения производительно сти) встречаются в практических приложениях очень часто. Как правило, у вас есть мас сив информации, которая должна быть отсортирована, скажем, в целях ее представления. Для сортировки контейнера можно использовать алгоритм s o r t () библиотеки STL:
sort (veclntegers.begin (), veclntegers.end ()); // порядок возрастания
Эта версия функции s o r t () применяет бинарный предикат s t d : : l e s s o , использую щий оператор o p e r a t o r c , реализованный содержащимся в векторе типом. Вы можете предоставить собственный предикат, чтобы изменить порядок сортировки, используя сле дующую перегруженную версию:
sort (veclntegers.begin (), veclntegers.end (),
[](int lhs, int rsh) {return (lhs > rhs);} ); // порядок убывания
536 ЗАНЯТИЕ 23. Алгоритмы библиотеки STL
Перед отображением коллекции следует удалить дубликаты. Для удаления располо женных рядом повторившихся значений используется алгоритм u n iq u e ():
auto iNewEnd = unique (veclntegers.begin (), veclntegers.end ()); veclntegers.erase (iNewEnd, veclntegers.end ()); // изменить размер
Для быстрого поиска библиотека STL предоставляет алгоритм b i n a r y _ s e a r c h (), который эффективен только в отсортированном контейнере:
bool bElementFound = binary_search (veclntegers.begin (), veclntegers.end (), 2011);
if (bElementFound)
cout « "Element found in the vector!" « endl;
В листинге 23.10 показаны такие алгоритмы библиотеки STL, как s t d : : s o r t (), кото
рый способен отсортировать диапазон s t d : :b in a r y _ s e a r c h (), обеспечивающий поиск
отсортированном диапазоне, и s t d : : u n iq u e (), удаляющий расположенные рядом со впадающие элементы (которые становятся смежными после сортировки).
ЛИСТИНГ 23.10. Использование функций sort (), binary search () и unique ()
#include
#include
#include
#include
using namespace std;
5
template ctypename T>
void DisplayContents(const T& Input)
{
for ( auto iElement = Input.cbegin() // auto, cbegin: C++11
10 ; iElement != Input.cend() // cend(): C++11
Do'stlaringiz bilan baham: |