★可変長配列2(vector)★


実際にプログラムを組む時には、「int型の可変長配列」よりも「構造体の可変長配列」を使う事の方が多いと思います。

そこで、構造体の可変長配列を使うプログラムを作ってみましょう。

<sample program cpp014-01>

#include <iostream>
#include <vector>

struct Player {
    int hp;
    int mp;
};

int main()
{
    std::vector<Player> vecPlayer;

    Player work;

    work.hp = 100;
    work.mp = 50;

    vecPlayer.push_back(work);

    for (unsigned int i = 0; i < vecPlayer.size(); i++) {
        std::cout << "Player" << i + 1 
            << " : HP = " << vecPlayer[i].hp
            << " : MP = " << vecPlayer[i].mp
            << std::endl;
    }

    return 0;
}

<実行結果>

Player1 : HP = 100 : MP = 50
続行するには何かキーを押してください・・・

int型などの場合、push_back関数にそのまま値を入れる事も出来ますが、構造体の場合は一旦実体を作ってpush_back関数に渡します。

前回も書きましたが、push_back関数は引数を値渡し(コピー)しています。

↓のような書き方も出来るようです。

<sample program cpp014-02>

#include <iostream>
#include <vector>

struct Player {
    int hp;
    int mp;
};

int main()
{
    std::vector<Player> vecPlayer;

    Player work;

    work.hp = 100;
    work.mp = 50;

    vecPlayer.push_back(work);

    vecPlayer.push_back(Player{ 123, 35 });

    for (unsigned int i = 0; i < vecPlayer.size(); i++) {
        std::cout << "Player" << i + 1 
            << " : HP = " << vecPlayer[i].hp
            << " : MP = " << vecPlayer[i].mp
            << std::endl;
    }

    return 0;
}

<実行結果>

Player1 : HP = 100 : MP = 50
Player2 : HP = 123 : MP = 35
続行するには何かキーを押してください・・・

その他のメンバ関数


ベクタに所属しているメンバ関数はいくつもありますが、少しだけ紹介します。

・最後尾のデータを削除する

pop_back関数を使う事で、最後尾のデータを削除出来ます。

<sample program cpp014-03>

#include <iostream>
#include <vector>

struct Player {
    int hp;
    int mp;
};

int main()
{
    std::vector<Player> vecPlayer;

    Player work;

    work.hp = 100;
    work.mp = 50;

    vecPlayer.push_back(work);

    vecPlayer.push_back(Player{ 123, 35 });

    vecPlayer.pop_back();

    for (unsigned int i = 0; i < vecPlayer.size(); i++) {
        std::cout << "Player" << i + 1 
            << " : HP = " << vecPlayer[i].hp
            << " : MP = " << vecPlayer[i].mp
            << std::endl;
    }

    return 0;
}

<実行結果>

Player1 : HP = 100 : MP = 50
続行するには何かキーを押してください・・・

2つ目のデータが消えています。


・全データを削除する

clear関数を使う事で、全てのデータを一度に削除することが出来ます。

<sample program cpp014-04>

#include <iostream>
#include <vector>

struct Player {
    int hp;
    int mp;
};

int main()
{
    std::vector<Player> vecPlayer;

    Player work;

    work.hp = 100;
    work.mp = 50;

    vecPlayer.push_back(work);

    vecPlayer.push_back(Player{ 123, 35 });

    vecPlayer.clear();

    for (unsigned int i = 0; i < vecPlayer.size(); i++) {
        std::cout << "Player" << i + 1 
            << " : HP = " << vecPlayer[i].hp
            << " : MP = " << vecPlayer[i].mp
            << std::endl;
    }

    return 0;
}

<実行結果>

続行するには何かキーを押してください・・・

データが無いため、表示もされません。


・データがあるか無いか調べる

上のプログラムの「clear」の行は削除します。

empty関数を使う事で、コンテナの中が空かどうか調べる事が出来ます。

<sample program cpp014-05>

#include <iostream>
#include <vector>

struct Player {
    int hp;
    int mp;
};

int main()
{
    std::vector<Player> vecPlayer;

    if (vecPlayer.empty()) {
        std::cout << "Empty" << std::endl;
    }

    Player work;

    work.hp = 100;
    work.mp = 50;

    vecPlayer.push_back(work);

    vecPlayer.push_back(Player{ 123, 35 });

    for (unsigned int i = 0; i < vecPlayer.size(); i++) {
        std::cout << "Player" << i + 1 
            << " : HP = " << vecPlayer[i].hp
            << " : MP = " << vecPlayer[i].mp
            << std::endl;
    }

    if (vecPlayer.empty()) {
        std::cout << "Empty" << std::endl;
    }

    return 0;
}

<実行結果>

Empty
Player1 : HP = 100 : MP = 50
Player2 : HP = 123 : MP = 35
続行するには何かキーを押してください・・・

empty関数はコンテナにデータが無い時は「bool型のtrue」を、データがある時は「bool型のfalse」を返します。

最初のif文の時は、データが入っていませんのでif文が成立しています。

最後のif文の時は、データが入っていますからif文は不成立となります。


次回は少し意味のあるプログラムにしてみましょう。


次へ

戻る

目次へ