C++のmap STLを使って学生の出席番号と名前を管理するプログラム
本記事では、C++のmapコンテナ(STL)を使用して、学生の出席番号(整数型)と名前(文字列型)を管理するプログラムを紹介します。
標準入力からn個のクエリが与えられます。各クエリ(各行)は基本的に2つの要素で構成され、タイプ1のクエリの場合は3つの要素になります。1番目の要素は操作の種類、2番目の要素は出席番号、そしてタイプ1の場合のみ3番目の要素として名前が与えられます。
操作の種類
- 挿入(Insert):指定された出席番号に対応するキーとして、名前をマップに登録します。
- 削除(Delete):指定された出席番号に対応するエントリをマップから削除します(存在する場合)。
- 検索(Search):指定された出席番号でマップ内の名前を検索します。見つかれば名前を表示し、存在しない場合は「Not found」と表示します。
入出力の例
例えば、n = 8 で queries = [[1,5,"Atanu"], [1,8,"Tapan"], [1,3,"Manish"], [2,8], [1,9,"Piyali"], [3,8], [3,3], [3,5]] の場合、出力は [Not found, Manish, Atanu] となります。これは、出席番号8が削除済みのため存在せず、出席番号3の学生の名前が「Manish」、出席番号5の学生の名前が「Atanu」であるためです。
解法のアプローチ
この問題を解くためには、以下の手順に従います。
- n := クエリの総数を受け取る
- キーが整数型、値が文字列型のマップ m を定義する
- n が0になるまで以下を繰り返す:
- 現在のクエリタイプ t を読み込む
- 出席番号 roll を読み込む
- t が1の場合:
- 名前を読み込み、m[roll] に代入する
- t が2の場合:
- m[roll] に空文字列を代入する(削除扱い)
- それ以外の場合(検索):
- m[roll] が空文字列でなければ、その内容を表示する
- 空文字列であれば「Not found」を表示する
実装例
理解を深めるために、以下の実装を見てみましょう。
#include <iostream>
#include <map>
using namespace std;
int main(){
int n;
cin >> n;
map<int, string> m;
while (n--) {
int t;
cin >> t;
int roll;
cin >> roll;
if (t == 1) {
string name;
cin >> name;
m[roll] = name;
} else if (t == 2) {
m[roll] = "";
} else {
if(m[roll] != "")
cout << m[roll] << endl;
else
cout << "Not found" << endl;
}
}
}入力例
8 1 5 Atanu 1 8 Tapan 1 3 Manish 2 8 1 9 Piyali 3 8 3 3 3 5
出力例
Not found Manish Atanu
C++のmapは内部で平衡二分探索木(赤黒木)を使用しているため、挿入・削除・検索のすべての操作がO(log n)の計算量で実行できます。この特性により、大量の学生データを効率的に管理することが可能です。
-
【C++ STL】map::operator[](添字演算子)の使い方とサンプルコード徹底解説
この記事では、C++ STLのmap(マップ)コンテナで使われる添字演算子「[]」、すなわちmap::operator[]について、その仕組み・構文・具体的な使用例をわかりやすく解説します。C++ STLにおけるmapとは?mapは連想コンテナの一種で、「キー値」とそれに対応する「マップ値」の組み合わせからなる要素を、特定の順序で格納できるコンテナです。mapコンテナ内部のデータは、常に関連付けられたキーに基づいて自動的にソートされます。また、各要素には一意なキーが割り当てられており、このキーを通じて値へアクセスします。map::operator[]([]演算子)とは?map::operato
-
C++のSTLを使って配列が回文かどうかを判定するプログラム
整数 n 個からなる配列 arr[n] が与えられたとき、「その配列は回文(パリンドローム)か?」を判定するのが本稿のテーマです。C++ の STL(標準テンプレートライブラリ)を活用して、この問題をシンプルに解いていきます。 STLとは STL(Standard Template Library)は、C++ に用意されたテンプレートクラスの集合体で、スタック・キュー・リストといったデータ構造や、ソート・反転などの便利な関数を提供します。これらを活用するには、テンプレートクラスに関する基本的な知識が必要です。本稿では、STL の reverse() 関数を使って配列を反転させています。 回文と