範囲内の2つの値を入れ替える

[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"
}