C++ c++;映射迭代器未在映射中的每个元素上循环
我试图循环使用c语言构建的std::map++ 这个映射相当奇怪,键是我创建的结构的向量(我使用了一个自定义比较器),值是双精度向量 我的问题是,当我在地图上迭代时,循环在我到达终点之前终止C++ c++;映射迭代器未在映射中的每个元素上循环,c++,maps,C++,Maps,我试图循环使用c语言构建的std::map++ 这个映射相当奇怪,键是我创建的结构的向量(我使用了一个自定义比较器),值是双精度向量 我的问题是,当我在地图上迭代时,循环在我到达终点之前终止 typedef map<int, map<vector<svm_node>, vector<double>, CompareSparseVectors> >::iterator DataIter; typedef map<vector<svm_no
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 ++;
}
}
}
myModel.modelData是一个映射
,比较分析向量
是一个包含向量
比较函数的结构。如果您需要更多的上下文,请让我知道,但似乎我没有一个足够复杂的映射,当使用.size()
查询时,它声称是一个大小,但无法完全迭代
编辑:下面是svm_节点
和CompareSparseVector
structs的代码
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;
}
};
struct-svm\u节点{
整数指数;
双重价值;
friend bool运算符==(常量svm_节点&a,常量svm_节点&b){
返回(a.index==b.index
&&
晶圆厂(a值-b值)<1E-20);
}
friend bool运算符!=(常量支持向量机节点&a,常量支持向量机节点&b){
返回值(a.index!=b.index
||
fabs(a值-b值)>1E-20);};
结构比较parsevectors{
布尔运算符()(常数向量a,常数向量b)
{
如果(a.size()!=b.size())返回true;
for(inti=0;i
当且仅当一个向量小于另一个向量时,确保您的ComparseSparseVectors
返回true。您应该能够运行:
vector<svm_mode> a, b;
cout << (CompareSparseVectors(a,b) && CompareSparseVector(b,a));
向量a,b;
cout没有(aI没有用于svm_节点的重载函数。我的印象是,如果这是我在CompareSparseVector中使用的唯一运算符,我只需要重写==即可。我将为svm_节点/CompareSparseVector添加代码……您不需要重载“哦,天哪,我想可能就是这样。出于某种原因,我认为比较函数应该表示相等,而不是小于相等。
vector<svm_mode> a, b;
cout << (CompareSparseVectors(a,b) && CompareSparseVector(b,a));