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

template< class T >
struct ColumnAdapter {
	ColumnAdapter( size_t column ) : m_column( column ) {}
	bool operator()( const std::vector< T > & left, const std::vector< T > & right ) {
		return left.at( m_column ) < right.at( m_column );
	}
private:
    size_t m_column;
};

int main() {
	std::vector< std::vector< int > > v = {
		{ 2,  3, 4, 5, 6, 7 },
		{ 1,  2, 3, 4, 5, 6 },
		{ 20, 30, 40, 50, 60, 70 },
		{ 2,  3, 4, 5, 6, 7 },
	};
	const size_t COLUMN = 1;
 	auto biggest = std::max_element(std::begin(v), std::end(v), ColumnAdapter< int >( COLUMN ) );
    std::cout << "Max element is " << (*biggest).at( COLUMN )
        << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v), ColumnAdapter< int >( COLUMN ) );
    std::cout << "min element is " << (*smallest).at( COLUMN )
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;	
	return 0;
}