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 < (const Point &other) const { return x < other.x || y < 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<Point> 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.