Как вернуть 2-мерный вектор? - PullRequest
1 голос
/ 25 августа 2010

У меня есть функция, которая создает 2D-вектор

void generate(int n)
{
   vector< vector<int> > V (n, vector<int>(1 << n , 0 ));
   .......

}//n is used to determine the size of vector

Теперь мне нужно вернуть созданный вектор, чтобы использовать его в другой функции. Если я сделал

return V ;

, то этобудет неправильно, потому что V является локальной переменной, но я не могу определить V вне функции, потому что эта функция определяет размер V.Что мне делать?

Ответы [ 4 ]

11 голосов
/ 25 августа 2010

Вы можете return V без проблем - он вернет копию локальной переменной. Проблемы возникают, только когда вы возвращаете ссылку или указатель на переменную с локальной областью видимости; когда функция завершается, локальная переменная выходит из области видимости и уничтожается, а ссылка / указатель больше не действительны.

В качестве альтернативы вы можете принять ссылку на вектор в качестве аргумента, записать его и вернуть void:

void generate(int n, std::vector< std::vector<int> >& vec) {
    vec.resize(n, std::vector<int>(1 << n, 0));
}

int main() {
    std::vector< std::vector<int> > v;
    generate(10, v);
}

Это быстрее, чем возвращать копию локального члена, что может быть дорого для больших объектов, таких как многомерные векторы.

5 голосов
/ 25 августа 2010
vector<vector<int> > generate(int n)
{
    vector<vector<int> > v(n, vector<int>(1 << n, 0));
    //...
    return v;
}

Возвращаемое значение является копией локальной переменной v, поэтому проблем нет вообще.

Если вы хотите скопировать вектор, возможно, вы могли бы сделать что-то вроде этого:

void generate(int n, vector<vector<int> >& v)
{
    v.clear(); //not necessary if you're sure it's empty
    v.resize(n, vector<int>(1 << n, 0));
    //...
}
0 голосов
/ 25 августа 2010

В качестве альтернативы другим ответам вы можете вернуть указатель на выделенный вектор кучи.Для защиты от утечек памяти вы можете использовать идиому «переместить конструктор».</p> <pre> typedef auto_ptr<vector<vector<int> > > vector_ptr; vector_ptr generate(int n) { vector_ptr V(new vector<vector<int> >(n, vector<int>(1 << n , 0 ))); return V; } // ... vector_ptr V(generate(some_number));

Эта идиома может использоваться для любого "тяжелого" объекта.Если вы хотите продлить время жизни возвращаемого объекта, вы можете назначить его на shared_ptr (как, например, boost :: shared_ptr)Но я думаю, что лучше возвращать копию, когда это возможно, для минимизации сложности вашего кода.

0 голосов
/ 25 августа 2010

если вектор маленький, просто верните его по значению, он будет скопирован.если вектор большой, вызывающая сторона может передать вектор dest по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...