我正在尝试遍历我在c ++中构建的std :: map
地图相当奇怪,键是我创建的结构的向量(我使用了自定义比较器),值是双打的向量。
我的问题是当我遍历地图时,循环在我到达终点之前终止。
typedef map<int, map<vector<svm_node>, vector<double>, CompareSparseVectors> >::iterator DataIter;
typedef map<vector<svm_node>, vector<double>, CompareSparseVectors>::iterator SVIter;
for(DataIter di = myModel.modelData.begin();
di != myModel.modelData.end();
++di) {
cout << "The size of (di->second) is " << di->second.size() << endl;
int itercount = 0;
for(SVIter sv = (di->second).begin();
sv != (di->second).end();
++sv) {
cout << itercount << endl;
itercount ++;
}
}
}
此代码段的输出为
The size of (di->second) is 47
0
1
The size of (di->second) is 18
0
1
myModel.modelData是map<int, map<vector<svm_node>, vector<double>, CompareSparseVectors> >
,ComparseSparseVectors
是包含vector<svm_node>
的比较函数的结构。如果你需要更多的上下文,请告诉我,但似乎我没有足够复杂的地图,当它被.size()
查询时它声称是一个大小,但是无法迭代完全。
编辑:以下是svm_node
和CompareSparseVector
结构的代码。
struct svm_node{
int index;
double value;
friend bool operator==(const svm_node& a,const svm_node& b) {
return (a.index == b.index
&&
fabs(a.value - b.value) < 1E-20);
}
friend bool operator!=(const svm_node& a,const svm_node& b) {
return (a.index != b.index
||
fabs(a.value - b.value) > 1E-20);} };
struct CompareSparseVectors {
bool operator()(const vector<svm_node> a, const vector<svm_node> b)
{
if(a.size() != b.size()) return true;
for(int i = 0; i < a.size(); ++i) {if(!(a[i] == b[i])) return true;}
return false;
}
};
答案 0 :(得分:2)
当且仅当一个向量小于另一个向量时,请确保ComparseSparseVectors
返回true。你应该能够运行:
vector<svm_mode> a, b;
cout << (CompareSparseVectors(a,b) && CompareSparseVector(b,a));
并为所有可能的a和b得到0。