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