2014-12-06 3 views
0

Я пытаюсь использовать std::set вместе с VectorXd из библиотеки Эйгеном:Эйген: станд :: набор с VectorXd

typedef VectorXd Vec; 

bool(*fn_pt)(Vec,Vec) = vecCompare; 
set<Vec,bool(*)(Vec,Vec)> yx (fn_pt); 

Функция vecCompare IST определяется следующим образом:

bool vecCompare (Vec v, Vec w) { 
    for (int i = 0; i < numCrit; ++i) { 
    if (v(i) < w(i)) return true; 
    } 

    return false; 
} 

Unfortunality, yx.find (x) работает некорректно, т. е. возвращает пустой итератор, даже если x уже находится в yx.

Что-то не в порядке с моим кодом?

+0

Является 'numCrit == v.rows()' (и '== w.rows()')? – Wintermute

+0

Да, это правда. –

ответ

1

vecCompare не является полным заказом. Он возвращает true, если любая координата в левом операнде меньше соответствующей координаты в правом операнде. Для векторов a = (1, 2), b = (2, 1), например, справедливы как vecCompare(a, b), так и vecCompare(b, a).

Если вы имели в виду лексикографическое упорядочение, это должно работать:

bool vecCompare (Vec v, Vec w) { 
    for (int i = 0; i < numCrit; ++i) { 
    if (v(i) < w(i)) return true; 
    if (v(i) > w(i)) return false; 
    } 

    return false; 
} 
Смежные вопросы