2013-07-19 4 views
0

Я пытающаяся петлю над стандом :: картой Я сконструированной в 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; 
    } 
    }; 
+0

Есть ли '(a '. Если у вас есть ошибка, и это не так, я думаю, что вы нарушили правила карты. – JoshG79

+0

У меня нет перегруженной функции < or > для svm_nodes. У меня создалось впечатление, что мне нужно только переопределить ==, если это единственный оператор, который я использую в CompareSparseVectors. Я добавлю код для svm_node/CompareSparseVector ... –

+0

Вам не нужно перегружать «<», но ваша функция сравнения должна быть двоичной функцией, которая должна возвращать true, если первый аргумент меньше второго аргумента. Если вы сделали «==», то это (или хотя бы a) проблема. – JoshG79

ответ

2

Убедитесь, что ваш ComparseSparseVectors возвращает истину, если и только если один вектор меньше других. Вы должны иметь возможность запускать:

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

и получите 0 для всех возможных a и b.

+0

Да, это было ... спасибо, сэр. –

Смежные вопросы