возврат вектора из функции c++

Есть такая функция:

#include <bits/stdc++.h>
using namespace std;
vector<int> unique(vector<int> *v)
{
    vector<int> unique_elements = {};
    sort((*v).begin(), (*v).end());
    unique_elements.push_back((*v)[0]);
    for(int i = 1; i < (*v).size(); i++)
    {
        if((*v)[i] != (*v)[i - 1])
        {
            unique_elements.push_back((*v)[i]);
        }
        else
        {

        }
    }
}

Что надо написать в return функции и что надо написать в функцию main, чтобы вывести вектор? И верно ли вообще, что надо выводить именно вектор, а не указатель на него например? А если надо выводить указатель, то в каких случаях вообще нужно выводить из функции указатель, а в каких сам вектор? Заранее спасибо.


Ответы (2 шт):

Автор решения: AlexGlebe

Всё зависит от задачи.

vector<int> unique_elements = {};
..
неправильно !
return & unique_elements ;

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


vector<int> & unique(vector<int> *v) {
  ..
  vector<int> & unique_elementsp = * new vector<int> ;
  return unique_elementsp ; }

int main (){
  ..
  vector<int> v ;
  vector<int> & unique_elements = unique(&v) ;
  ..
  delete & unique_elements ;
  .. }

указатель или ссылку можно вернуть, если вы создали объект в куче.


vector<int> unique(vector<int> *v) {
  ..
  return unique_elements ; }

int main (){
  ..
  vector<int> v ;
  vector<int> unique_elements = unique(&v) ;
  .. }

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


vector<int> unique(vector<int> *v)
..
return std :: move ( unique_elements  ) ;

это самый экономный способ, функция вернёт созданный вектор в функции не трогая, и он будет находиться временно в стеке.

Если вектор нужен временно, то возвращайте по значению, а если будет работать долго, то создавайте в куче (с new) и возвращайте ссылкой.

Не забывать надо про освобождение памяти. Временные объекты удаляются автоматически, а созданные вручную с помощью new vector<int> нужно удалить вручную используя delete & unique_elements ; когда этот вектор уже не нужен.

→ Ссылка
Автор решения: Никита Самоуков

Можно так сделать:

vector<int> unique(vector<int> &v)
{
    vector<int> unique_elements = {};
    sort(v.begin(), v.end());
    unique_elements.push_back(v[0]);
    for(int i = 1; i < v.size(); i++)
    {
        if(v[i] != v[i - 1])
        {
            unique_elements.push_back(v[i]);
        }
        else
        {

        }
    }
    return unique_elements;
}

Но эта функция изменяет исходные данные, так как они передаются по ссылке.

Передавать же вектор в функцию можно разными способами.

По значению, тогда будет создана новая копия вектора:

vector<int> unique(vector<int> v)

По ссылке, тогда это будет обращение к тому же вектору:

vector<int> unique(vector<int> &v)

По константной ссылке, тогда это будет обращение к тому же вектору(но его будет нельзя изменять(хотя вообще если очень хочется, то все равно можно если использовать reinterpret или C cast)):

vector<int> unique(const vector<int> &v)

По указателю, тогда это будет обращение к тому же вектору(но при таком способе предполагается, что может бытm передан и nullptr):

vector<int> unique(vector<int> *v)
→ Ссылка