AOJ 10015 - Finding Missing Cards

AOJ先生が4x13の配列つくるといいよと言ってくれましたが、俺はこのset_differenceを使うぜ。
まず、すべてのカードの配列をつくります。
次に、持っているカードの配列をつくります。
その差は失くしたカードになります。

set_differenceの第5引数は第一のiteratorの中の値が第二のiteratorより小さいときTrue、
それ以外のときfalseを返すようにするそうです(less thanとequalをなぜか間違えてた)

あと、第4引数はdiffだとだめで(日本のcppreferenceが間違ってる?)、
std::inserter(diff, diff.begin())(英語のcppreferenceでの記述)は通りました。
Output_iteratorとinserterを調べないといけないですね。

for_each, lambda式ををつかったので、今回はC++11で提出しました。

#include <iostream>
#include <vector>
#include <algorithm>

struct card{
	char mark;
	int number;
	card(char, int);
};

card::card(char _mark, int _number)
	:mark(_mark), number(_number){}

int MarkToInt(char mark){
	if(mark == 'S')return 0;
	else if(mark == 'H')return 1;
	else if(mark == 'C')return 2;
	else if(mark == 'D')return 3;
	return -1;
}

bool AscendingCard(const card& left_card,
										const card& right_card){
	int lm = MarkToInt(left_card.mark),
		rm = MarkToInt(right_card.mark);
	if(lm != rm){
		return lm < rm;
	}
	return left_card.number < right_card.number;
}

int main(){
	char marks[] = {'S', 'H', 'C', 'D'};
	std::vector<card> all_cards, brought_cards;
	
	for(int i=0;i<4;i++){
		for(int j=1;j<=13;j++){
			card new_card = card(marks[i], j);
			all_cards.push_back(new_card);
		}
	}

	int n;
	std::cin >> n;
	char mark;
	int number;
	while(n--){
		std::cin >> mark >> number;
		card new_card = card(mark, number);
		brought_cards.push_back(new_card);
	}

	std::sort(brought_cards.begin(), 
						brought_cards.end(),
						AscendingCard);

	
	std::vector<card> diff;
	std::set_difference(all_cards.begin(),
								 all_cards.end(),
								 brought_cards.begin(),
								 brought_cards.end(),
								 std::inserter(diff, diff.begin()),
								 AscendingCard);

	auto show = [](card &c){
		std::cout << c.mark << " " << c.number << std::endl;
	};
	std::for_each(diff.begin(), diff.end(), show);
}