c++映射迭代器没有在映射中的每个元素上循环

c++ map iterator not looping over every element in the map

本文关键字:映射 元素 循环 迭代器 c++      更新时间:2023-10-16

我正试图循环使用我在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_nodeCompareSparseVector结构的代码。

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;
    }
  };

确保ComparseSparseVectors返回true,当且仅当一个向量小于另一个向量。你应该能够运行:

vector<svm_mode> a, b;
cout << (CompareSparseVectors(a,b) && CompareSparseVector(b,a));

并且对于所有可能的a和b得到0。