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.
#include<algorithm>
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; } }
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; } }
Zdefiniujmy kolekcję.
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");
replace(miasta.begin(), miasta.end(),std::string("Warszawa"),std::string("Gdansk"));
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"));