Różnice między wybraną wersją a wersją aktualną.
— |
replace_replace_if [2008/12/11 16:19] (aktualna) kswietko utworzono |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
+ | ====== 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 ===== | ||
+ | |||
+ | <code cpp> #include<algorithm> </code> | ||
+ | |||
+ | ===== Definicja replace ===== | ||
+ | <code cpp> template<class For, class T> | ||
+ | void replace(For first, For last, const T& val, const T& new_val) | ||
+ | { | ||
+ | while (first != last) | ||
+ | { | ||
+ | if(*first == val) | ||
+ | *first = new_val; | ||
+ | ++first; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== 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 ===== | ||
+ | <code cpp> template<class For, class T> | ||
+ | void replace_if(For first, For last, Pred p, const T& new_val) | ||
+ | { | ||
+ | while (first != last) | ||
+ | { | ||
+ | if(p(*first) | ||
+ | *first = new_val; | ||
+ | ++first; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===== 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ę. | ||
+ | <code cpp> | ||
+ | typedef std::list<std::string> Miasta; | ||
+ | Miasta miasta; | ||
+ | miasta.push_back("Warszawa"); | ||
+ | miasta.push_back("Krakow"); | ||
+ | miasta.push_back("Poznan"); | ||
+ | miasta.push_back("Ostrow Mazowiecka"); | ||
+ | miasta.push_back("Warszawa"); | ||
+ | |||
+ | </code> | ||
+ | ===== Przykład użycia replace ===== | ||
+ | <code cpp> | ||
+ | replace(miasta.begin(), miasta.end(),std::string("Warszawa"),std::string("Gdansk")); | ||
+ | </code> | ||
+ | ===== Przykład użycia replace_if ===== | ||
+ | Zdefiniujmy predykat: | ||
+ | <code cpp> | ||
+ | bool is_gdansk(const std::string& miasto) | ||
+ | { | ||
+ | return (miasto == "Gdansk"); | ||
+ | } | ||
+ | </code> | ||
+ | Wywolanie replace_if | ||
+ | <code cpp> | ||
+ | replace_if(miasta.begin(),miasta.end(),is_gdansk,std::string("Wroclaw")); | ||
+ | </code> | ||
+ | |||