#include <memory>
#include <set>
#include <functional>
#include <algorithm>
#include <iostream>
struct Cell {
int mX;
Cell(int x) : mX(x) {}
size_t GetX() const { return mX;}
};
struct CellSorter {
bool operator()(const std::shared_ptr<Cell>& l, const std::shared_ptr<Cell>& r) const
{
return l->GetX() < r->GetX();
}
};
class CellInCol : public std::unary_function<const std::shared_ptr<Cell>,
bool>
{
public:
CellInCol( size_t col ) : _col( col ) {}
bool operator() ( const std::shared_ptr<Cell> &a ) const
{
return a->GetX() == _col;
}
private:
size_t _col;
};
int main()
{
typedef std::set<std::shared_ptr<Cell>, CellSorter> Container;
Container _grid;
_grid.insert( std::shared_ptr<Cell>(new Cell(1)));
_grid.insert( std::shared_ptr<Cell>(new Cell(2)));
_grid.insert( std::shared_ptr<Cell>(new Cell(7)));
_grid.insert( std::shared_ptr<Cell>(new Cell(10)));
Container col;
size_t c = 7;
std::remove_copy_if( _grid.begin(), _grid.end(),
std::inserter( col, col.begin() ),
std::not1( CellInCol( c ) ) );
std::cout << "col has " << col.size() << " elements\n"
<< " the first element is " << (*col.begin())->GetX() << '\n';
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4Kc3RydWN0IENlbGwgewogICAgICAgIGludCBtWDsKICAgICAgICBDZWxsKGludCB4KSA6IG1YKHgpIHt9CiAgICAgICAgc2l6ZV90IEdldFgoKSBjb25zdCB7IHJldHVybiBtWDt9Cn07CnN0cnVjdCBDZWxsU29ydGVyIHsKICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENlbGw+JiBsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2VsbD4mIHIpIGNvbnN0CiAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGwtPkdldFgoKSA8IHItPkdldFgoKTsKICAgICAgICB9Cn07CgpjbGFzcyBDZWxsSW5Db2wgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2VsbD4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+CnsKcHVibGljOgogICAgQ2VsbEluQ29sKCBzaXplX3QgY29sICkgOiBfY29sKCBjb2wgKSB7fQogICAgYm9vbCBvcGVyYXRvcigpICggY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENlbGw+ICZhICkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gYS0+R2V0WCgpID09IF9jb2w7CiAgICB9CnByaXZhdGU6CiAgICBzaXplX3QgX2NvbDsKfTsKaW50IG1haW4oKQp7CiAgICB0eXBlZGVmIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxDZWxsPiwgQ2VsbFNvcnRlcj4gQ29udGFpbmVyOwogICAgQ29udGFpbmVyIF9ncmlkOwogICAgX2dyaWQuaW5zZXJ0KCBzdGQ6OnNoYXJlZF9wdHI8Q2VsbD4obmV3IENlbGwoMSkpKTsKICAgIF9ncmlkLmluc2VydCggc3RkOjpzaGFyZWRfcHRyPENlbGw+KG5ldyBDZWxsKDIpKSk7CiAgICBfZ3JpZC5pbnNlcnQoIHN0ZDo6c2hhcmVkX3B0cjxDZWxsPihuZXcgQ2VsbCg3KSkpOwogICAgX2dyaWQuaW5zZXJ0KCBzdGQ6OnNoYXJlZF9wdHI8Q2VsbD4obmV3IENlbGwoMTApKSk7CiAgICBDb250YWluZXIgY29sOwogICAgc2l6ZV90IGMgPSA3OwogICAgc3RkOjpyZW1vdmVfY29weV9pZiggX2dyaWQuYmVnaW4oKSwgX2dyaWQuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omluc2VydGVyKCBjb2wsIGNvbC5iZWdpbigpICksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om5vdDEoIENlbGxJbkNvbCggYyApICkgKTsKICAgIHN0ZDo6Y291dCA8PCAiY29sIGhhcyAiIDw8IGNvbC5zaXplKCkgPDwgIiBlbGVtZW50c1xuIgogICAgICAgICAgICAgIDw8ICIgdGhlIGZpcnN0IGVsZW1lbnQgaXMgIiA8PCAoKmNvbC5iZWdpbigpKS0+R2V0WCgpIDw8ICdcbic7Cn0K