カテゴリ: C++ 更新日: 2026/02/09

C++ポインタとSTLコンテナの関係を完全攻略!初心者でもわかるデータ管理

ポインタとSTLコンテナの関係
ポインタとSTLコンテナの関係

先生と生徒の会話形式で理解しよう

生徒

「先生、C++には『STLコンテナ』っていう便利な入れ物があるって聞いたんですけど、ポインタと一緒に使うことはあるんですか?」

先生

「はい、もちろんです!STLコンテナとポインタを組み合わせることで、より効率的で自由自在なプログラミングができるようになりますよ。」

生徒

「でも、ポインタって住所を指すものですよね?入れ物の中に住所を入れる……なんだか複雑そうです。」

先生

「難しく考えなくて大丈夫です。例え話を使って、そのメリットと使い方を順番に解説していきますね!」

1. STLコンテナとは?(便利な魔法の入れ物)

1. STLコンテナとは?(便利な魔法の入れ物)
1. STLコンテナとは?(便利な魔法の入れ物)

C++を学ぶ上で欠かせないのがSTLコンテナです。STLとは「Standard Template Library(標準テンプレートライブラリ)」の略で、コンテナとは「データを整理して入れておくための容器」のことを指します。

パソコンを触ったことがない方でも、料理の「タッパー」や、書類を整理する「バインダー」を想像してみてください。 C++には、データの種類や使い方に合わせて、いろいろな形の魔法の入れ物が用意されています。

  • std::vector(ベクター): データを一列に並べて管理する、最も使いやすい入れ物です。
  • std::list(リスト): データの追加や削除が得意な、鎖のような構造の入れ物です。

これらを使うと、わざわざ自分でメモリの管理をしなくても、自動的にサイズを調整してくれるので非常に便利です。

2. ポインタをコンテナに入れる理由

2. ポインタをコンテナに入れる理由
2. ポインタをコンテナに入れる理由

通常、コンテナには「数値」や「文字」をそのまま入れますが、実は「ポインタ(住所)」を入れることもよくあります。 なぜ直接データを入れずに、わざわざ住所(ポインタ)を入れるのでしょうか?

最大の理由は、「大きな荷物を移動させるのは大変だから」です。 例えば、とても重くて大きなタンスをあちこちの部屋に運び回るのは重労働ですよね。でも、そのタンスが置いてある場所の「住所」を書いた紙一枚なら、簡単に受け渡しができます。

プログラミングでも同じです。複雑で巨大なデータそのものをコンテナの中で動かすと、パソコンの動作が重くなってしまいます。 代わりにポインタを入れることで、データの移動を高速化し、メモリを節約することができるのです。

3. コンテナにポインタを格納する実践例

3. コンテナにポインタを格納する実践例
3. コンテナにポインタを格納する実践例

それでは、実際に std::vector というコンテナの中に、整数の住所(ポインタ)を入れて管理するプログラムを書いてみましょう。


#include <iostream>
#include <vector>

int main() {
    int apple_price = 150;
    int banana_price = 200;

    // 整数へのポインタ(住所)を格納するベクターを作成
    std::vector<int*> price_list;

    // 住所をコンテナに追加する
    price_list.push_back(&apple_price);
    price_list.push_back(&banana_price);

    // コンテナから住所を取り出し、その場所の中身を表示する
    for (int i = 0; i < price_list.size(); i++) {
        // price_list[i] はポインタなので、* をつけて中身を見る
        std::cout << i + 1 << "つ目の価格: " << *price_list[i] << "円" << std::endl;
    }

    return 0;
}

出力結果:


1つ目の価格: 150円
2つ目の価格: 200円

このように、コンテナに直接数字を入れるのではなく、変数の場所(住所)を教えてあげることで、間接的にデータを操作できます。

4. イテレータ:ポインタに似た「指し示す道具」

4. イテレータ:ポインタに似た「指し示す道具」
4. イテレータ:ポインタに似た「指し示す道具」

STLコンテナを扱う上で、ポインタと並んで重要なのがイテレータ(反復子)です。 イテレータは、コンテナの中にある「今、何番目のデータを見ているか」を指し示す、ポインタによく似た専用の道具です。

パソコンの操作に例えると、マウスのカーソルのようなものです。 コンテナの先頭から末尾まで、イテレータを動かすことで、中身を順番にチェックしていくことができます。

イテレータもポインタと同じように、アスタリスク * を使うことで、その場所にあるデータを取り出すことができます。

5. イテレータを使ったデータの走査

5. イテレータを使ったデータの走査
5. イテレータを使ったデータの走査

次に、イテレータを使ってコンテナの中身を順番に表示する、より「C++らしい」書き方を見てみましょう。


#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> animals = {"いぬ", "ねこ", "うさぎ"};

    // コンテナの先頭を指すイテレータを取得
    std::vector<std::string>::iterator it;

    std::cout << "動物リストを表示します:" << std::endl;

    // 先頭(begin)から末尾(end)までイテレータを進める
    for (it = animals.begin(); it != animals.end(); ++it) {
        // イテレータに * をつけると中身の文字列が取得できる
        std::cout << "・" << *it << std::endl;
    }

    return 0;
}

出力結果:


動物リストを表示します:
・いぬ
・ねこ
・うさぎ

この animals.begin()animals.end() という書き方が、コンテナと住所の仕組みを結びつける重要なポイントになります。

6. ポインタ管理とコンテナの注意点(メモリの安全)

6. ポインタ管理とコンテナの注意点(メモリの安全)
6. ポインタ管理とコンテナの注意点(メモリの安全)

コンテナにポインタを入れるときは、一つだけ大きな注意点があります。 それは、「住所だけ持っていても、その場所にある家(データ)が壊れていたら意味がない」ということです。

プログラムの途中でデータそのものが消えてしまったのに、コンテナの中に古い住所(ポインタ)だけが残っていると、その住所を訪ねた瞬間にプログラムがクラッシュしてしまいます。

これを防ぐためには、コンテナとポインタの寿命(生きている期間)をしっかり合わせるか、以前学習した「スマートポインタ」をコンテナに入れて管理するのが、現代のプログラミングでの安全なやり方です。

7. コンテナ内のポインタを並び替えるメリット

7. コンテナ内のポインタを並び替えるメリット
7. コンテナ内のポインタを並び替えるメリット

最後に、ポインタとコンテナの強力な組み合わせの例を紹介します。 例えば、膨大な量の名簿データがあるとします。名前順に並び替えたり、年齢順に並び替えたりしたいとき、データそのものを動かすのは時間がかかります。

しかし、名簿の「住所(ポインタ)」だけを並び替えるなら一瞬です。 本体のデータは動かさず、「どの順番で住所を訪ねるか」というリストだけを書き換える。 これが、C++でポインタとSTLコンテナを組み合わせて使う際の、最高に賢い活用術なのです。

8. さまざまなコンテナとポインタの関係

8. さまざまなコンテナとポインタの関係
8. さまざまなコンテナとポインタの関係

今回は std::vector を例に出しましたが、他のコンテナでもポインタは活躍します。

  • std::map(マップ): 「名前」と「住所」をセットで保存しておく、住所録のような入れ物です。
  • std::set(セット): 同じデータが入らないように自動でお掃除してくれる入れ物です。

どのコンテナを使うにしても、「データそのものを入れるのか」「住所(ポインタ)を入れるのか」を考えられるようになると、あなたのプログラミングスキルは飛躍的にアップします。 最初は難しく感じるかもしれませんが、まずは「住所を入れると楽ができる場合があるんだな」という感覚を掴むところから始めてみましょう!

カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.4
Java&Spring記事人気No4
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.5
Java&Spring記事人気No5
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.6
Java&Spring記事人気No6
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作