1. 導入:なぜassign()が必要なのか?
C++でstd::vectorを使っているとき、「一度作った配列の中身を、別の値で全部上書きしたい」「別の配列のデータで中身を入れ替えたい」という場面に直面することはありませんか?
通常、for文で一つずつ代入したり、一度clear()してからpush_back()を繰り返したりしがちですが、これではコードが長くなり、効率も良くありません。assign()メソッドを使うと、コンテナの中身を驚くほどシンプルに、かつ効率的に入れ替えることができます。
2. 基礎知識:assign()とは何か
assign()は、std::vectorなどのコンテナが持つ「中身を丸ごと置き換える」ためのメソッドです。
これを使うと、以下のことができます。
・既存のデータをすべて破棄し、新しいデータをセットする。
・コンテナのサイズ(要素数)も自動的に調整してくれる。
つまり、「初期化」と「代入」を同時に行える便利なツールだと考えてください。
3. 実装と解決策
assign()には主に2つの使い方があります。
1. 同じ値で埋め尽くす:指定した個数分、同じ値でコンテナを埋めます。
2. 範囲を指定してコピーする:別の配列や、別のvectorの特定範囲をコピーして置き換えます。
特に「サイズが変わるかもしれない」という動的な処理において、自分でメモリ管理やリサイズを意識しなくて済むのが最大のメリットです。
4. サンプルプログラム
以下のコードをコピーして、ご自身の環境で試してみてください。
include
include
int main() {
// 1. 初期状態のvectorを作成
std::vector
// 2. assignを使って「100を5個」の状態に書き換える
// これにより、元の {1, 2, 3, 4, 5} は全て消去されます
v.assign(5, 100);
std::cout << "--- 100を5個代入 ---" << std::endl; for(int n : v) std::cout << n << " "; // 結果: 100 100 100 100 100 std::cout << std::endl; // 3. 別の配列から値をコピーして入れ替える int arr[] = {10, 20, 30}; v.assign(arr, arr + 3); // ポインタを使って範囲指定 std::cout << "--- 配列からコピーして入れ替え ---" << std::endl; for(int n : v) std::cout << n << " "; // 結果: 10 20 30 std::cout << std::endl; return 0; }
5. 応用・注意点
現場で使う際に注意すべきポイントが2つあります。
・メモリの再確保:assign()を行うと、新しいサイズに合わせて内部のメモリが確保し直されることがあります。もし非常に巨大なデータを頻繁にassign()する場合、パフォーマンスに影響が出る可能性があるため、必要に応じてreserve()などで事前に容量を確保しておく検討も大切です。
・型の一致:assign()でコピーする際は、代入元の要素型と、vectorの要素型に互換性があることを確認してください。型が全く異なる場合はコンパイルエラーになります。
まずは「中身を全部入れ替えたいときはassign()!」と覚えておくだけで、コードの可読性が格段に上がりますよ。ぜひ活用してみてください。

コメント