前章で作った成績表ではデータの修正はできても、削除は
できませんでした。今回は削除もできるようにします。
すでに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