- 因为最近在做一个C++简单角色类游戏的设计,在角色类的武器槽里用到了vector容器以及迭代。
class Role
{
public:
Role();
~Role();
Role(string name, int phy, int mag,int defend);//构造
bool islive();//判断是否存活
void attack(Role & player);//攻击其他角色
void reset(string name, int phy, int mag,int defend);//角色参数重置
void showrole();//显示角色状态
void equip(equipment weapon);//给角色装备武器
void takeoff(equipment weapon);//卸下武器
void practice();//角色修炼
void upweapon();//武器升级
//protected:
string name;
int level;
int blood;
int phy;
int mag;
int blue;
int harm;
int defend;
vector<equipment>weapon;//武器槽
int flag;//武器标志位
int defendflag;
};
-
vector容器声明
vector<equipment“>weapon;//武器槽
equipment是我自己定义的一个类,“这个符号删掉。 -
添加与删除指定元素
(1)添加(向武器槽内装备武器)
void Role::equip(equipment weapon){//装备武器
if (this->weapon.size() >= 3){
cout << "武器槽已满,无法装备武器!" << endl;
}
else{
this->weapon.push_back(weapon);
flag += 1;//武器标志位
cout << name << "装备了" << weapon.name << "!" << endl << endl;
}
}
(2)有条件的删除元素(卸下指定武器)
注意:顺序式容器会使本身和后面的元素迭代器都失效,所以不能简单的++操作,这里顺序式容器的erase()会返回紧随被删除元素的下一个元素的有效迭代器
void Role::takeoff(equipment weapon){//卸下武器
vector<equipment>::iterator i;
for (i = this->weapon.begin(); i != this->weapon.end();){
if ((*i).name == weapon.name){
i = this->weapon.erase(i);
flag -= 1;
cout << name << "卸下了" << weapon.name << "!" << endl << endl;
}
else{
++i;
}
}
}
若是节点式容器的条件删除:
vector<equipment>::iterator i;
for (i = this->weapon.begin(); i != this->weapon.end();){
if (...)
{
//因为节点式只会导致当前节点迭代器失效,所以删除节点的同时对迭代器进行后移的操作,因为其他元素不会失效
i.erase(i++);
}
else
{
++i;
}
}
此处参考博客:https://www.cnblogs.com/Yogurshine/p/4030728.html
- 遍历
vector<equipment>::iterator i;
for (i = weapon.begin(); i != weapon.end(); i++){
cout << "所持装备:" << (*i).name << endl;
cout << "装备等级:" << (*i).e_level << endl;
cout << "攻击加成:" << (*i).e_phyadd << endl;
cout << "魔法加成:" << (*i).e_magadd << endl;
cout << "防御加成:" << (*i).defend << endl;
cout << "武器耐久度:" << (*i).durability << endl;
}
}