すでに5名分のデータが入力されています。
メニューの4番(データの削除)を選択します。
削除したいデータの番号を入力します。
ここでは、2番のデータ(吉田)を削除することにします。
削除する前に確認のメッセージが出ます。
データを表示させると確かに、吉田さんのデータは削除されています。
データを削除するにはeraseメンバ関数を使います。
iterator erase( iterator _Where ); iterator erase( iterator _First, iterator _Last );反復子_Whereが指し示しているデータが削除されます。
_Firstから_Lastまでが指し示しているデータが削除されます。
戻り値は削除した次のデータとなります。
削除した後すぐにbeginメンバ関数で反復子がデータの先頭を指し示すようにすると 安全です。
では、プログラムを見てみましょう。
// vector04.cpp #include <iostream> #include <vector> #include <string> using namespace std; int menu(); int input_data(); int show_data(); int shusei(); int del(); vector<int> point; vector<string> shimei; int main() { int menuno, endmark = 0; string nm, yesno; while (1) { menuno = menu(); switch (menuno) { case 1: input_data(); break; case 2: show_data(); break; case 3: shusei(); break; case 4: del(); break; case 0: endmark = 1; break; } if (endmark == 1) break; } return 0; }メニューの4番が増えました。
int menu() { int no; while (1) { cout << endl; cout << "**** MENU ***" << endl; cout << "1:データ入力" << endl; cout << "2:データ表示" << endl; cout << "3:データ修正" << endl; cout << "4:データ削除" << endl; cout << "0:終了" << endl; cout << "---> "; cin >> no; if (no < 0 || no > 4) { cout << endl; cout << "番号が不正です" << endl; continue; } break; } return no; }「4:データ削除」が増えました。
int input_data() { string nm; int pt; while (1) { cout << "氏名 = "; cin >> nm; if (nm == "end") break; shimei.push_back(nm); cout << "得点 = "; cin >> pt; point.push_back(pt); cout << endl; } return (int)shimei.size(); } int show_data() { int i, no; no = (int)point.size(); cout << endl; for (i = 0; i < no; i++) cout << "[" << i << "]" << shimei[i] << "---" << point[i] << endl; return 0; } int shusei() { int no, datano, pt; string nm, yesno; vector<int>::iterator p; vector<string>::iterator q; p = point.begin(); q = shimei.begin(); datano = (int)point.size(); while (1) { cout << endl; cout << "修正するデータの番号 = "; cin >> no; if (no < 0 || no >= datano) { cout << "番号が不正です" << endl; continue; } cout << "氏名 = "; cin >> nm; cout << "得点 = "; cin >> pt; q += no; p += no; *q = nm; *p = pt; cout << "続けますか(Y/N) -- "; cin >> yesno; if (yesno == "N") break; } return 0; }これらの関数に変更はありません。
int del() { int no, datano; char yn[8]; vectorデータを削除する関数です。::iterator p; vector ::iterator q; p = point.begin(); q = shimei.begin(); while (1) { datano = (int)point.size(); if (datano == 0) { cout << "データがありません" << endl; return -1; } show_data(); cout << "削除するデータの番号 -- "; cin >> no; if (no < 0 || no > datano) { cout << "番号が不正です" << endl; return -2; } cout << no << "番のデータ(" << shimei[no] << ")を削除しますか(Y/N) -- "; cin >> yn; if (strcmp(yn, "Y") == 0) { p += no; point.erase(p); q += no; shimei.erase(q); cout << "削除されました" << endl; p = point.begin(); q = shimei.begin(); } cout << "続けますか(Y/N) -- "; cin >> yn; if (strcmp(yn, "Y") != 0) break; } return 0; }
全部データを削除後も削除しようとすると「データがありません」といわれます。
今回も簡単でした。データをファイルに保存したり、ファイルから読み出したりできるように 改良してみてください。
Update Jan/14/2003 By Y.Kumei