Comparação de pontos cartesianos

Quero criar uma coleção onde a ordem dos pontos é primeiramente feita em relação a x e depois em relação a y:
exemplo:
0,0
0,1
1,0
1,1

Eu criei a estrutura com o seguinte operador < :

[code]struct Point {
int x, y;

Point() : x(0), y(0) {}
Point(int x, int y) : x(x), y(y) {}
bool operator &lt; (const Point &other) const { return x &lt; other.x || y &lt; other.y; };

};
[/code]

Mas quando tento usar uma STL Collection como a std::set recebo um erro dizendo que o operador que sobrescrevi é inválido:

std::set&lt;Point&gt; area = { Point(0, 0), Point(2, 0), Point(0, 2), Point(2, 2) };

Pode ser que sua versão do compilador não aceite inicialização de conjuntos com initializers (tal como você tentou fazer).

Por exemplo, para o VS 2010 , que implementa apenas parcialmente o C++11, você teria uma mensagem de erro como:

point.cpp(13) : error C2552: 'area' : non-aggregates cannot be initialized with
initializer list
        'std::set<_Kty>' : Types with a base are not aggregate
        with
        [
            _Kty=Point
        ]

Eu dei um tapinha no seu exemplo para funcionar com o VS 2010, talvez funcione também com qualquer versão moderna do g++.

#include <set>
#include <string>
#include <iostream>
#include <iterator>

using namespace std;

    struct Point {  
        int x, y;  
      
        Point() : x(0), y(0) {}  
        Point(int x, int y) : x(x), y(y) {}  
        bool operator < (const Point &other) const { 
            if (x < other.x) return true;
            if (x == other.x) return y < other.y;
            return false;
        };  
    };  
    std::ostream& operator << (ostream& os, const Point& p) {
        os << "(" << p.x << "," << p.y << ")";
        return os;
    }

    std::set<Point> area;

    int main (int argc, char *argv[]) {
        area.insert (Point (0, 0));
        area.insert (Point (2, 0));
        area.insert (Point (0, 2));
        area.insert (Point (2, 2));
	// Para imprimir os elementos:
        std::ostream_iterator<Point> out_it (std::cout, ", ");
        std::copy (area.begin(), area.end(), out_it);
        
    }

estou usando o VS 2013 Preview, funciona perfeitamente a inicialização no modo lista do C++11, pois com list que não exige sobrecarga do operador < funciona normalmente

Estranhamente o problema foi resolvido com a sobrecarga que você indicou, muito obrigado entanglement.
Digo estranhamente pois parece funcionalmente o mesmo.
Porque isso acontece!?

Perdão finalmente entendi muito obrigado entanglement, realmente temos o caso em que o teste x < other.x falha pois x > other.x que significa que o ponto não é menor que o other, mas ainda sim é testado y < other.y.
Erro lógico catastrófico kkkk perdão.