2015-11-18 4 views
1

Я в настоящее время программирую матрицу шаблонов. Он содержит vector<vector<T>> под названием mat и cols и rows vals, которые содержат количество строк и столбцов. Я попытался построить итератор и выяснил, что я не могу построить итераторную функцию для вектора вектора. так как остальная часть моего кода уже была написана, я добавил функцию matrixToVector, которая превращает мой vector<vector<T>> в vector<T> (я знаю, что это не лучший вариант, но это просто упражнение в колледже). На моем ноутбуке Windows отлично работает в туннелях, но в компьютерных лабораториях Linux первые два номера итератора всегда являются очень большим случайным числом, а затем 0, а затем остальные номера в порядке. Вот код:Итератор, который работает на окнах, но не на linux

/** 
    * turns the 2d mat vecor to 1d vector. 
    */ 
    vector<T> matrixToVector() 
    { 
     vector<T> v; 
     for(unsigned int i = 0 ; i < rowsNum; i++) 
     { 
      for(unsigned int j = 0; j < colsNum; j++) 
      { 
       v.push_back(mat[i][j]); 
      } 
     } 
     return v; 

    } 

    /** 
    * iterator 
    */ 
    typedef typename std::vector<T>::const_iterator const_iterator; 


    /** 
    * return the end of the iterator. 
    */ 
    const_iterator end() 
    { 
     return matrixToVector().end(); 
    } 

    /** 
    * return the begining of the iterator. 
    */ 
    const_iterator begin() 
    { 
     return matrixToVector().begin(); 
    } 

Я понятия не имею, что это неправильно. Что мне делать?

EDIT: Когда я печатаю матрицу с обычной функцией печати, она отлично работает на Linux и Windows.

+2

Вы неопределенное поведение. Вектор, создаваемый 'matrixToVector', выходит за пределы области видимости, и итератор, который возвращает' begin', будет указывать на разрушенный объект. –

+0

Печать @lurker с обычной функцией печати, которая печатает матрицу, отлично работает и с linux. – COOKIE

+0

@SimonGibbons в этом случае, почему я успешно распечатываю весь контент матрицы, за исключением первых двух элементов? – COOKIE

ответ

7
const_iterator begin() 
    { 
     return matrixToVector().begin(); 
    } 

вы возвращаете ссылку на объект в стеке, результат matrixToVector() создать временный объект, который будет уничтожен после возвращения из begin

+0

«Вы возвращаете ссылку на объект в стеке», <- не совсем. То, что возвращается, действительно является итератором * по значению *. Проблема заключается не в том, что возвращается ссылка на временное, а на то, что возвращается недействительный итератор. –

+0

@CrazyEddie То же самое. Итератор недействителен, потому что это ссылка на временный объект, который больше не существует. –

+0

@DavidSchwartz - Я бы сказал, что они разные по-разному. Например, просто недействительный итератор, сидящий вокруг, сам по себе не будет вызывать UB. Доступ к ней будет, если вы не исправите проблему, так же как и ее повторное использование, но просто ее не будет. Возврат ссылки на временные или автоматические данные мгновенно вызывает UB и делает программу плохо сформированной. –

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