C++の変数とデータ型を徹底解説!基本型とSTLコンテナの使い分けガイド
生徒
「先生、C++でデータを保存するための『変数』には、いろいろな種類があると聞きました。どう使い分ければいいんですか?」
先生
「そうですね。C++には、一つの値を扱う『基本型』と、たくさんの値をまとめて管理できる『STLコンテナ』という便利な道具があります。」
生徒
「STLコンテナ……なんだか難しそうですね。初心者でも使いこなせますか?」
先生
「もちろんです!身近な例えを使えば、仕組みはとてもシンプルですよ。まずはそれぞれの特徴から順番に見ていきましょう!」
1. 変数とデータ型の基本:プログラムの「箱」を理解しよう
プログラミング未経験の方がまず知っておくべきことは、変数(へんすう)とは「データを入れておくための箱」だということです。そして、その箱に入れる中身の種類(数値なのか、文字なのかなど)を指定するのがデータ型(だーたがた)です。
C++は、この箱の形にとても厳しい言語です。リンゴを入れるための箱にはリンゴしか入れられず、ミカンを入れることはできません。このように、あらかじめ入れるものの種類を決めておくことで、コンピューターは無駄なく高速に計算を行うことができるのです。まずは、もっともシンプルで単一のデータを扱う「基本型」から詳しく解説します。
2. 基本型(プリミティブ型)の種類と役割
基本型とは、C++という言語が最初から用意してくれている「最小単位の箱」のことです。これらは「数値」や「真偽」といった一つの情報だけを保存します。日常生活で例えるなら、小銭入れや印鑑ケースのような、一つの決まった目的のために使う小さな容器です。
- int(イント): 整数(1、100、-50など)を扱う型。もっとも頻繁に使われます。
- double(ダブル): 小数(3.14、0.5など)を扱う型。精密な計算に使います。
- char(キャラ): 文字('A'、'あ'など)を一つだけ扱う型。
- bool(ブール): 「はい(true)」か「いいえ(false)」の二択を扱う型。
これらの型は、メモリ(コンピューターの作業用机)を消費する量が非常に少なく、処理速度が非常に速いのが特徴です。まずは整数の変数を使ってみるコードを見てみましょう。
#include <iostream>
int main() {
int apple_count = 5; // リンゴの数を整数で保存
double price = 150.5; // 価格を小数で保存
bool is_fresh = true; // 新鮮かどうかを「はい/いいえ」で保存
std::cout << "リンゴの数: " << apple_count << "個" << std::endl;
std::cout << "価格: " << price << "円" << std::endl;
return 0;
}
3. たくさんのデータを扱う「STLコンテナ」とは?
基本型は便利ですが、困ることもあります。例えば、クラス全員(40人)のテストの点数を管理したいとき、基本型の箱を40個も作るのは大変です。そこで登場するのがSTLコンテナです。
STL(Standard Template Library)とは、C++に標準で備わっている「便利な道具セット」のことです。その中にあるコンテナは、たくさんのデータをまとめて入れておける「魔法の収納ボックス」のようなものです。コンテナを使えば、データが増えたり減ったりしても、プログラムが自動で箱の大きさを調整してくれます。
パソコンを触ったことがない方でも、「本棚」や「引き出し」をイメージしてください。一冊の本を入れるのが基本型、その本を何十冊も整理して並べられるのがコンテナです。代表的なコンテナには std::vector(ベクター)があります。
4. 動的配列の王様「std::vector」の使い方
STLコンテナの中でもっとも人気があり、初心者が最初に覚えるべきなのが std::vector です。これは、後から自由に要素(中身)を追加したり削除したりできる「伸び縮みする配列」です。
基本型の配列(C言語スタイルの配列)は一度大きさを決めると変えられませんが、ベクターなら「後から新入生が来たので点数の箱を一つ増やす」といった操作が簡単に行えます。使い方は以下の通りです。
#include <iostream>
#include <vector> // ベクターを使うための準備
int main() {
// 整数を入れるためのベクターを作成
std::vector<int> scores = {80, 90, 75};
scores.push_back(100); // 最後に100点を追加
std::cout << "1番目の人の点数: " << scores[0] << "点" << std::endl;
std::cout << "データの個数: " << scores.size() << "個" << std::endl;
return 0;
}
1番目の人の点数: 80点
データの個数: 4個
5. 文字列を扱う専用コンテナ「std::string」
C++で「文字」を扱う場合、基本型の char は一文字しか入りません。しかし、実際には「名前」や「メッセージ」といった長い文章を扱いたいことがほとんどです。そのために用意されているのが std::string という型です。
これも広義にはコンテナの一種で、文字がずらっと並んだ状態を一つのデータとして扱えます。初心者の方は、基本型の仲間のように感じますが、実は非常に高機能な道具です。足し算のように文字を連結したり、特定の文字が含まれているか探したりすることが簡単にできます。
#include <iostream>
#include <string> // 文字列を使うための準備
int main() {
std::string first_name = "太郎";
std::string last_name = "山田";
// 文字列をくっつける
std::string full_name = last_name + " " + first_name;
std::cout << "お名前: " << full_name << std::endl;
std::cout << "文字数: " << full_name.length() << std::endl;
return 0;
}
6. 基本型とコンテナ、どちらを使えばいいの?
使い分けの基準は非常にシンプルです。「扱うデータが一つだけなら基本型、たくさんならコンテナ」と考えましょう。
具体的には、以下のような判断基準で選ぶのがプロのやり方です。
- 基本型を選ぶ時: 年齢、身長、フラグ(ON/OFF)など、単一の値だけで意味が完結する場合。
- コンテナを選ぶ時: 商品リスト、出席簿、1週間の気温の変化など、複数の値をグループとして扱いたい場合。
コンテナは非常に便利ですが、基本型に比べるとメモリを多く使い、処理もわずかに複雑になります。しかし、現代のコンピューターは非常に高性能なので、初心者のうちは「迷ったら便利なコンテナ(vectorやstring)を使う」というスタンスでも問題ありません。無理にメモリを節約しようとしてプログラムが複雑になるより、読みやすさを優先しましょう。
7. コンテナを使う時の注意点:初期化とアクセス
コンテナを使う際に初心者がつまずきやすいポイントが二つあります。一つは初期化、もう一つは範囲外アクセスです。
初期化とは、箱を使い始める前に中身を整えることです。空っぽのベクターからデータを取り出そうとすると、プログラムは「何もない!」と驚いて壊れて(クラッシュして)しまいます。また、3つしかデータが入っていないのに「5番目を見せて」と命令することも禁止されています。これを「範囲外アクセス」と呼び、初心者がもっとも多く出すミスの代表格です。
これを防ぐためには、コンテナのサイズを常に意識し、empty()(空かどうか調べる)や size()(個数を調べる)といった機能を使って、中身を確認する習慣をつけることが大切です。
8. 未経験から始めるデータ型学習のコツ
「int、double、vector……覚えられない!」と感じるかもしれませんが、安心してください。これらは一度にすべて暗記する必要はありません。実際にプログラムを書いて、エラーを出して、修正していくうちに、自然と手が覚えていきます。キーボードを叩いて、自分の書いたコードで画面に数字や文字が出る喜びを体験することが、上達への一番の近道です。
まずは int で計算をし、次に string で言葉を扱い、慣れてきたら vector でたくさんのデータを並べてみる。この3ステップを繰り返すだけで、あなたはもうC++の世界の住人です。データ型を正しく選べるようになると、プログラムの「設計図」を書く力が格段にアップしますよ!