#include <iostream>
#include <vector>
#include <set>
#include <functional>
#include <algorithm>
using namespace std;

struct pnt {
    int num;
    bool has;
};

struct filter {
	set<int> seen;
	bool operator()(const pnt& p) {
		return !p.has && (seen.find(p.num) != seen.end());
	}
};

int main() {
	pnt data[] = {
		{3,true}, {4, true}, {4, false}, {3, true}, {5, false}, {5, true}, {7, false}, {8, false}, {9, false}, {10, true}, {10, false}
	};
	vector<pnt> v(data, data+11);
	cout << "Before:" << endl;
	for (vector<pnt>::const_iterator i = v.begin() ; i != v.end() ; i++) {
		cout << i->num << " " << i->has << endl;
	}
	filter f;
	for (vector<pnt>::const_iterator i = v.begin() ; i != v.end() ; i++) {
		if (i->has) {
			f.seen.insert(i->num);
		}
	}
	v.erase(remove_if(v.begin(), v.end(), f), v.end());
	cout << "After:" << endl;
	for (vector<pnt>::const_iterator i = v.begin() ; i != v.end() ; i++) {
		cout << i->num << " " << i->has << endl;
	}
	return 0;
}