我正在尝试将std::set
与来自Eigen库的VectorXd
一起使用:
typedef VectorXd Vec;
bool(*fn_pt)(Vec,Vec) = vecCompare;
set<Vec,bool(*)(Vec,Vec)> yx (fn_pt);
函数vecCompare
定义如下:
bool vecCompare(Vec v, Vec w) {
int n = v.rows();
for (int i = 0; i < n; ++i) {
if (v(i) < w(i)) {
return true;
} else if (v(i) > w(i)) {
return false;
}
}
return false;
}
不幸的是,我最终在yx中遇到了重复的元素。有什么想法吗?
Edit1 :对于简单的例子,一切正常,例如,
set<Vec,vecCompare> test;
Vec t(3);
t(0)=33;
t(1)=44;
t(2)=55;
test.insert(t);
test.insert(t);
我的代码我插入了大约2000个向量,我得到了大约200个重复元素。
Edit2 :矢量由算法计算。我按照插入yx
的顺序输出向量,直到插入两个重复的元素,得到以下列表:
10068.4, 2355, 4794
9787.28, 4582, 2532
10188, 3218, 3111
7696.03, 3506, 3540
7933.94, 2864, 4844
8321.96, 4432, 2804
8502.21, 3732, 2928
9976.05, 3859, 2681
9623.74, 3397, 2967
8815.94, 2987, 3556
9082.79, 2693, 3954
9976.81, 2574, 3991
10002.5, 3443, 2915
8264.29, 3392, 3290
7169.08, 4594, 3622
7073.8, 4756, 3771
7005.82, 3749, 4985
7833, 4000, 3150
8096.63, 2876, 4193
8107.36, 2892, 4143
7459.51, 3246, 4489
9061.37, 2480, 4617
7718.64, 3001, 4820
9069.39, 2471, 4861
7744.1, 4449, 3155
8320.67, 4120, 2850
8875.47, 4655, 2596
8858.44, 4321, 2627
8616.2, 4085, 2759
8114.57, 3602, 3176
8114.57, 3602, 3176
然后我手工创建了这30个向量,并将它们手工插入一组。令人惊讶的是,一切都很好。我不明白这一点。
Edit3 :我还注意到,在运行以下内容时,zz
保持0
,但yx
包含大约200个重复项。
int zz = 0;
for (auto y1: yx) {
int i = 0;
for (auto y2: yx) {
if (y1 == y2) {
i++;
}
if (i > 1) zz++;
}
}
答案 0 :(得分:0)
您可以尝试将vecCompare
声明为功能对象而不是函数。
typedef VectorXd Vec;
struct vecCompare {
bool operator()(const Vec &v, const Vec &w) const
{
int n = v.rows();
for (int i = 0; i < n; ++i) {
if (v(i) < w(i)) {
return true;
} else if (v(i) > w(i)) {
return false;
}
}
return false;
}
};
set<Vec, vecCompare> yx;
但是,只要VectorXd
将double
存储为元素,就需要特别注意浮点精度问题。 似乎相等的两个浮点数可能不完全相等。