Я пытаюсь использовать std::set
вместе с VectorXd
из библиотеки Eigen:
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.
Что-то не так с моим кодом?
vecCompare
не является полным заказом. Он возвращает true
если любая координата в левом операнде меньше соответствующей координаты в правом операнде. Для векторов a = (1, 2), b = (2, 1), например, vecCompare(a, b)
как 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;
}
numCrit == v.rows()
(и== w.rows()
)?