知見を得たので備忘
struct Member
{
int num;
std::string name;
Member()
:num(0)
,name("")
{}
Member(int nu, std::string na)
:num(nu)
, name(na)
{}
bool operator==(const Member mem)
{
bool is_hit = false;
if (num != 0)
{
is_hit = num == mem.num;
}
else
{
is_hit = name == mem.name;
}
return is_hit;
}
bool operator!=(const Member mem)
{
bool is_hit = false;
if (num != 0)
{
is_hit = num == mem.num;
}
else
{
is_hit = name == mem.name;
}
return !is_hit;
}
};
int main()
{
std::vector Member> mem;
mem.push_back(Member(10, "ABC"));
mem.push_back(Member());
mem.push_back(Member(5, "C"));
mem.push_back(Member(6, "A"));
mem.push_back(Member(7, "B"));
mem.push_back(Member(8, "C"));
mem.push_back(Member(9, "A"));
for (const auto& ite : mem)
{
std::cout << ite.name << " : " << ite.num << std::endl;
}
Member search = Member(5, "C");
auto re = std::find(mem.begin(), mem.end(), search);
if (re == mem.end())
{
return -1;
}
re->name = "選ばれた";
std::cout << std::endl;
for (const auto& ite : mem)
{
std::cout << ite.name << " : " << ite.num << std::endl;
}
return 0;
}
結果↓
ABC : 10
: 0
C : 5
A : 6
B : 7
C : 8
A : 9
ABC : 10
: 0
選ばれた : 5
A : 6
B : 7
C : 8
A : 9
std::findを用いて、配列から一致するもののイテレーターを渡してくれるもの。
一致するかどうかの判定は、構造体で定義したoperator==から見ている。
一致するものが無ければイテレーターは.end()となっている。
注意点としては、operator==が正しくないとstd::findで正しく判定されない。