プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【C++】構造体でstd::find

知見を得たので備忘

 


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で正しく判定されない。