Я пытающаяся петлю над стандом :: картой Я сконструированной в C++C++ карта итератор не зацикливание над каждым элементом в карте
Карты довольно странно, ключи являются векторами структур I» (я использовал пользовательский компаратор), а значения - векторы удвоений.
Моя проблема в том, что когда я перебираю по карте, цикл заканчивается до того, как я дойду до конца.
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()
, но не может быть полностью повторен.
EDIT: Вот код для svm_node
и 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;
}
};
Есть ли '(a '. Если у вас есть ошибка, и это не так, я думаю, что вы нарушили правила карты. – JoshG79
У меня нет перегруженной функции < or > для svm_nodes. У меня создалось впечатление, что мне нужно только переопределить ==, если это единственный оператор, который я использую в CompareSparseVectors. Я добавлю код для svm_node/CompareSparseVector ... –
Вам не нужно перегружать «<», но ваша функция сравнения должна быть двоичной функцией, которая должна возвращать true, если первый аргумент меньше второго аргумента. Если вы сделали «==», то это (или хотя бы a) проблема. – JoshG79