====== Algorytmy replace replace_if ======
Algorytmy replace, replace_if umożliwiają przeglądanie ciągu (kolekcji) i zamianę wartości na inne, zgodnie ze specyfikacją.
Algorytm replace używa operatora==() do porównywania elementów, replace_if przyjmuje predykat jako warunek zamiany.
Algorytmy te umożliwiają łatwy, jednoznaczny i zwięzły sposób realizacji bardzo częstej operacji jaką jest zamiana.
===== Nagłówek =====
#include
===== Definicja replace =====
template
void replace(For first, For last, const T& val, const T& new_val)
{
while (first != last)
{
if(*first == val)
*first = new_val;
++first;
}
}
===== Parametry replace=====
* first - pierwszy element ciągu
* last - element za ostatnim w ciągu
* val - wartość wzorca, obiekty o tej wartości będą zamieniane
* new_val - wartość na którą będą zamieniane obiekty pasujące do wzorca (val)
===== Definicja replace_if =====
template
void replace_if(For first, For last, Pred p, const T& new_val)
{
while (first != last)
{
if(p(*first)
*first = new_val;
++first;
}
}
===== Parametry replace_if=====
* first - pierwszy element ciągu
* last - element za ostatnim w ciągu
* pred - predykat, jeżeli dla danego elementu ciągu zwróci TRUE, element ten zostanie zamieniony na new_val
* new_val - wartość na którą będą zamieniane elementy spełniające predykat
===== Przykłady =====
Zdefiniujmy kolekcję.
typedef std::list Miasta;
Miasta miasta;
miasta.push_back("Warszawa");
miasta.push_back("Krakow");
miasta.push_back("Poznan");
miasta.push_back("Ostrow Mazowiecka");
miasta.push_back("Warszawa");
===== Przykład użycia replace =====
replace(miasta.begin(), miasta.end(),std::string("Warszawa"),std::string("Gdansk"));
===== Przykład użycia replace_if =====
Zdefiniujmy predykat:
bool is_gdansk(const std::string& miasto)
{
return (miasto == "Gdansk");
}
Wywolanie replace_if
replace_if(miasta.begin(),miasta.end(),is_gdansk,std::string("Wroclaw"));