我正在尝试与Eigen 库中的std::set
一起使用: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:我还注意到,在运行以下命令时,尽管包含大约 200 个重复项,但zz
仍保持在。0
yx
int zz = 0;
for (auto y1: yx) {
int i = 0;
for (auto y2: yx) {
if (y1 == y2) {
i++;
}
if (i > 1) zz++;
}
}