【C++】std::replace, replace_if でコンテナの要素を置換する方法

目次

はじめに

C++でvectorなどのコンテナを操作する際、「特定の値を持つ全ての要素を、別の値に置き換えたい」「特定の条件を満たす全ての要素を、別の値に置き換えたい」という場面は頻繁に発生します。

forループを書いて自力で実装することもできますが、C++の標準ライブラリ <algorithm> には、このための専用関数が用意されています。

  • std::replace: 特定のに一致する要素を、新しい値に置き換える。
  • std::replace_if: ラムダ式などで指定した条件に一致する要素を、新しい値に置き換える。

この記事では、これら2つの関数を使って、コンテナの要素を安全かつ効率的に置換する方法を解説します。


replace / replace_if を使ったサンプルコード

このコードは、vectorに格納された数値のリストに対して、「10という値を全て99に置き換える」処理と、「奇数の値を全て0に置き換える」処理を、それぞれの関数を使って行います。

完成コード

#include <iostream>
#include <vector>
#include <algorithm> // replace, replace_if

using namespace std;

// vectorの内容を表示するヘルパー関数
void print_vector(const string& title, const vector<int>& vec) {
    cout << title << ": { ";
    for (int val : vec) {
        cout << val << " ";
    }
    cout << "}" << endl;
}

int main() {
    vector<int> data = {10, 25, 10, 40, 55};
    
    print_vector("初期状態", data);

    // --- 1. replace: 値が10の要素を、全て99に置き換える ---
    replace(data.begin(), data.end(), 10, 99);
    print_vector("replace後", data);

    // --- 2. replace_if: 奇数の要素を、全て0に置き換える ---
    replace_if(data.begin(), data.end(), [](int n){ return n % 2 != 0; }, 0);
    print_vector("replace_if後", data);
    
    return 0;
}

実行結果

初期状態: { 10 25 10 40 55 }
replace後: { 99 25 99 40 55 }
replace_if後: { 99 0 99 40 0 }

コードの解説

1. std::replace

replace(範囲の開始, 範囲の終了, 探す古い値, 新しい値);

  • 機能: 指定された範囲内に、第3引数で指定した古い値と完全に一致する要素を全て探し出し、第4引数の新しい値に置き換えます。

2. std::replace_if

replace_if(範囲の開始, 範囲の終了, 条件, 新しい値);

  • 機能: 指定された範囲内の各要素に対して、第3引数で指定した条件(述語)を適用し、その条件がtrueを返した全ての要素を、第4引数の新しい値に置き換えます。
  • [](int n){ return n % 2 != 0; }: このラムダ式は、「int型のnを受け取り、もしnが奇数ならtrueを返す」という条件を定義しています。

まとめ

今回は、C++の <algorithm> ライブラリが提供する、コンテナの要素を置換するためのstd::replacestd::replace_ifを解説しました。

  • std::replace: で置換する。
  • std::replace_if: 条件で置換する。

手動でループを書いて値を書き換えるよりも、これらの標準アルゴリズム関数を使った方が、コードが簡潔で意図が明確になり、よりC++らしい書き方と言えます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次