Как тип vector инициализировать от vector?

Рейтинг: 1Ответов: 1Опубликовано: 19.10.2014

Вот способ, который пришел в голову, но первый вектор (iv) почему-то пустой.

#include <string>
#include <vector>

typedef std::vector<std::string> stringVector;
typedef std::vector<int> intVector;

intVector & StringVectorToIntVector(const stringVector strv){
intVector iv;

for (int i = 0; i < strv.size(); i++)
    iv.push_back(atoi(strv[i].c_str()));

   return iv;
}

#include <iostream>

using namespace std;

int main(){
stringVector v;
intVector iv;

v.push_back("10");
v.push_back("15");
v.push_back("20");

iv = StringVectorToIntVector(v);

return 0;
}

Ответы

▲ 1

Вы создали вектор на стеке, и возвращаете ссылку на него. Так нельзя, объект умрёт после окончания работы функции.

Это компилируется, но неверно, и есть по стандарту undefined behaviour. Происходит что-то случайное. (С C++ не стоит полагаться на эксперимент, только на документацию.)

Возвращайте по значению, или передавайте ссылку на вектор в функцию.

А вообще-то, надо использовать std::transform вот так или даже вот так.

Обновление

@perfect: Ну, насчёт стека вам придётся разобраться, если вы программируете на низкоуровневом языке типа C++. Вкратце: локальные переменные функции умирают, когда функция заканчивается. Лишь возвращаемое значение копируется наружу. Ссылка не продлевает жизнь переменным (за исключением нескольких случаев, как обычно в C++). Так что возвращённая ссылка указывает на «труп».