2010-09-15 2 views
0

Я хочу инструмент для удаления повторяющихся узлов («узлы» в смысле конечного элемента, просто точки в пространстве с определенными координатами). В принципе, я хочу иметь возможность брать коллекцию узлов и сокращать ее за счет исключения дополнительных узлов, которые находятся в пределах определенного допуска на расстоянии других узлов. Я полагаю, что набор узлов STL, отсортированный по координате, подойдет к биту с хорошей производительностью. Мой вопрос заключается в том, как включить допуск, который можно установить во время выполнения.Использование устанавливаемого допуска в объекте сравнения для набора STL

Рассмотрим простую функцию сравнения клавиш для 1D-случая (единственная координата на узел). Я знаю, что моя логика может быть сокращена; это не то, о чем мой вопрос.

struct NodeSorter_x{ 
    //Stores Node objects sorted by x coordinate within tolerance TOL 
    bool operator()(const Node N1, const Node N2) const 
    { 
     //returns true if N1 < N2 and not within TOL distance 
     return (N1.x < N2.x) && !(fabs(N1.x - N2.x) < TOL); 
    } 
}; 

И набор, содержащий уникальные объекты-узлы (без дубликатов) ...

std::set <Node,NodeSorter_x> UniqueNodeSet; 

Итак, я хочу, чтобы иметь возможность установить TOL, используемый в сравнении во время выполнения. Как мне это сделать?

ответ

0
struct NodeSorter_x{ 
    NodeSorter_x(double tol) : TOL(tol) {} 
    bool operator()(const Node N1, const Node N2) const 
    { 
     //returns true if N1 < N2 and not within TOL distance 
     return (N1.x < N2.x) && !(fabs(N1.x - N2.x) < TOL); 
    } 
}; 

std::set <Node,NodeSorter_x> UniqueNodeSet(NodeSorter_x(0.1)); 
+0

Ahh, конструктор для объекта сравнения. Имеет смысл. Я предполагаю, что есть способ получить к нему доступ после создания UniqueNodeSet, чтобы изменить допуск. Глядя на документацию stl, похоже, что это будет нечто вроде UniqueNodeSet.key_compare.setTolerance (val), предполагая, что в NodeSorter_x существуют соответствующие memebers. –

Смежные вопросы