возврат вектора из функции 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 шт):
Всё зависит от задачи.
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)