実際にプログラムを組む時には、「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文は不成立となります。
次回は少し意味のあるプログラムにしてみましょう。