возврат значения через reference параметр
От: Vegost Россия  
Дата: 15.02.18 10:26
Оценка:
Есть функция которая по ряду причин может иметь возвращаемый тип только void
правильно ли будет так возвращать vector из функции


void create(vector<Points>& points)
{
vector<Points> v;
points = v;
}


main()
{
vector<Points> a;
create(a);
}

не будет ли какого нибудь лишнего копирования или чего доброго не прибьет ли выход из функции create созданную на стеке временную переменную v?
Re: возврат значения через reference параметр
От: Dair Россия https://dair.spb.ru
Дата: 15.02.18 10:30
Оценка:
Здравствуйте, Vegost, Вы писали:

V>Есть функция которая по ряду причин может иметь возвращаемый тип только void

V>правильно ли будет так возвращать vector из функции

V> void create(vector<Points>& points)

V> {
V> vector<Points> v;
V> points = v;
V> }
V>main()
V>{
V> vector<Points> a;
V> create(a);
V>}

V>не будет ли какого нибудь лишнего копирования или чего доброго не прибьет ли выход из функции create созданную на стеке временную переменную v?


Лишнего не будет, но копирование один раз будет вызвано в месте где points = v;

поэтому я бы так не делал, а делал бы сразу

void create(vector<Point>& points) {
    points.push_back(Point(1,2));
    ...
}
Re: возврат значения через reference параметр
От: Анатолий Широков СССР  
Дата: 15.02.18 10:31
Оценка: +4
Здравствуйте, Vegost, Вы писали:

V>не будет ли какого нибудь лишнего копирования или чего доброго не прибьет ли выход из функции create созданную на стеке временную переменную v?


все будет хорошо, но, если локальный вектор тебе уже не нужен, ты можешь лишнее копирование убрать:

void foo(std::vector<int>& r) {
  std::vector<int> tmp;
  ...
  r = std::move(tmp);
}
Отредактировано 15.02.2018 10:32 Анатолий Широков . Предыдущая версия .
Re[2]: возврат значения через reference параметр
От: Stanislav V. Zudin Россия  
Дата: 15.02.18 10:35
Оценка: +2
Здравствуйте, Dair, Вы писали:

V>>не будет ли какого нибудь лишнего копирования или чего доброго не прибьет ли выход из функции create созданную на стеке временную переменную v?


D>Лишнего не будет, но копирование один раз будет вызвано в месте где points = v;

D>поэтому я бы так не делал, а делал бы сразу

D>
D>void create(vector<Point>& points) {
D>    points.push_back(Point(1,2));
D>    ...
D>}
D>


Мы не знаем, как формируется внутренний массив и какие требования к целостности данных.
Если таки необходимо строить данные в локальном массиве, то я бы сделал вместо
points = v;

по старинке
points.swap(v); 
// или по-современному 
points = std::move(v);
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: возврат значения через reference параметр
От: Vegost Россия  
Дата: 15.02.18 10:48
Оценка:
Здравствуйте, Dair, Вы писали:

D>Лишнего не будет, но копирование один раз будет вызвано в месте где points = v;

D>поэтому я бы так не делал, а делал бы сразу
D>
D>void create(vector<Point>& points) {
D>    points.push_back(Point(1,2));
D>    ...
D>}
D>



На самом деле функция выглядит как то так:

vector<Points> getPoints()
{
vector<Points> v;
...
return v;
}

void create(vector<Points>& points)
{
...
points = getPoints();
...
}
Re: возврат значения через reference параметр
От: Caracrist https://1pwd.org/
Дата: 07.04.18 19:46
Оценка:
Здравствуйте, Vegost, Вы писали:

V>Есть функция которая по ряду причин может иметь возвращаемый тип только void


иногда дефолтный конструктор дорог или просто отсутствует

    void create(std::optional<vector<Points>>& out_points)
    {
        vector<Points> v;
        out_points.emplace(std::move(v)); //или любой другой конструктор
    }


main()
{
    std::optional<vector<Points>> a;
    create(a);
}
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.