【C++】std::fill, fill_n でコンテナの要素を特定の値で埋める方法

目次

はじめに

C++でvectorなどのコンテナを特定の値、例えば 0-1 で初期化・リセットしたい場合があります。forループを使って一つずつ代入することもできますが、C++の標準ライブラリ <algorithm> には、このための専用関数が用意されています。

  • std::fill: 指定した範囲の要素を、全て同じ値で上書きする。
  • std::fill_n: 指定した開始位置からN個の要素を、同じ値で上書きする。

この記事では、これら2つの関数を使って、コンテナの要素を指定した値で効率的に埋める方法を解説します。


fill / fill_n を使ったサンプルコード

このコードは、vectorに格納された数値のリストに対して、まず fill ですべての要素を 0 にし、次に fill_n で先頭から3つの要素を 100 に上書きします。

完成コード

#include <iostream>
#include <vector>
#include <algorithm> // fill, fill_n

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 = {1, 2, 3, 4, 5};
    
    print_vector("初期状態", data);

    // --- 1. fill: 全ての要素を 0 で埋める ---
    fill(data.begin(), data.end(), 0);
    print_vector("fill後", data);

    // --- 2. fill_n: 先頭から3つの要素を 100 で埋める ---
    fill_n(data.begin(), 3, 100);
    print_vector("fill_n後", data);
    
    return 0;
}

実行結果

初期状態: { 1 2 3 4 5 }
fill後: { 0 0 0 0 0 }
fill_n後: { 100 100 100 0 0 }

コードの解説

1. std::fill

fill(範囲の開始イテレータ, 範囲の終了イテレータ, 設定する値);

  • 機能: 第1引数と第2引数で指定された範囲 [first, last) の全ての要素に、第3引数で指定した値を代入します。

2. std::fill_n

fill_n(開始イテレータ, 要素数, 設定する値);

  • 機能: 第1引数で指定された開始位置から、第2引数で指定された要素数だけ、第3引数の値を代入します。
  • fill(v.begin(), v.begin() + 3, 100) と書くのと同じ意味ですが、fill_n の方がより意図が明確で簡潔です。

まとめ

今回は、C++の <algorithm> ライブラリが提供する、コンテナの要素を特定の値で埋めるためのstd::fillstd::fill_nを解説しました。

  • std::fill: 範囲を指定して、値を設定する。
  • std::fill_n: 開始位置と個数を指定して、値を設定する。

手動でループを書くよりも、これらの標準アルゴリズム関数を使った方が、コードが簡潔で意図が明確になり、コンテナを特定の値で初期化・リセットする際の定石的な書き方となります。

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

この記事を書いた人

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

目次