- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 
                        /* use <first> of a [std::pair] */
template<typename _type_, typename _pred_>
struct use_first {
	use_first(_type_ val, _pred_ pred) { value = val; predicate = pred; }
	
	template<typename _first_type_, typename _second_type_>
	bool operator()(const std::pair<_first_type_, _second_type_> &pr)
	{
		return predicate(pr.first, value);
	}
private:
	_type_ value;
	_pred_ predicate;
};
/* factory function: use it to init a [use_first] object */
template<typename _type_, typename _pred_>
use_first<_type_, _pred_> make_use_first(_type_ value, _pred_ pred)
{
	return use_first<_type_, _pred_>(value, pred);
}
/* usage of [use_first] */
std::vector< std::pair<int, int> > lol;
std::vector< std::pair<int, int> >::iterator = std::find_if(lol.begin(), lol.end(), make_use_first(0, std::equal_to()));
                                     
        
            собственно была проблема в том, что в контейнерах(например std::vector, std::deque) хранятся пары(std::pair) и зачастую нужно организовать какие-либо действия либо по первому(first), либо по второму(second) члену из std::pair.
приведен код только для first, ибо код для second немного похож
в итоге получилось сие поделие, а еще я люблю обмазаться несвежим....