[1, 2, 3, 1, 3]
となってる範囲の1と3を入れ替えたい、というような時に以下のswap_range_valueアルゴリズムを使用する
template <class ForwardIterator, class T> inline void swap_range_value(ForwardIterator first, ForwardIterator last, T lhs, T rhs) { while (first != last) { if (*first == lhs) { *first = rhs; } else if (*first == rhs) { *first = lhs; } ++first; } } template <class InputIterator, class OutputIterator, class T> inline void swap_range_value(InputIterator first, InputIterator last, OutputIterator result, T lhs, T rhs) { while (first != last) { if (*first == lhs) { *result = rhs; } else if (*first == rhs) { *result = lhs; } else { *result = *first; } ++first; ++result; } }
指定範囲を書き換える版
#include <string> #include <iostream> using namespace std; int main() { string s = "12313"; swap_range_value(s.begin(), s.end(), '1', '3'); cout << s << endl; // "32131" }
出力イテレータ版
#include <string> #include <vector> #include <iostream> using namespace std; int main() { string s = "12313"; vector<char> v(s.length()); swap_range_value(s.begin(), s.end(), v.begin(), '1', '3'); cout << string(v.begin(), v.end()) << endl; // "32131" }