Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207

Вернуть измененный вектор из функции

28.04.2017, 07:52. Показов 5803. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотел написать метод функции такой, чтобы можно в него было передать какой-то вектор, но который этот вектор не изменял бы, а выдавал бы новый, видоизмененный, на основе того, переданного...

C++
1
2
   vector<double>& function::freeV(vector<double> &v, double x)
   {...}
И тут возникла проблема. Если просто создать внутри вектор, то метод ничего и не вернет. Но можно через new

C++
1
2
3
4
5
6
vector<double>& function::freeV(vector<double> &v, double x)
{
    vector<double>* tmp = new vector<double>(N);
    (*tmp)[0] = v[0]*exp(x);
    return *tmp;
}
И все прекрасно передается. Только вот не удаляется... Ну т.е. если там в деструкторе прописать delete tmp; он, естественно, и не поймет, что за tmp Как быть?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2017, 07:52
Ответы с готовыми решениями:

Как вернуть вектор из функции?
Как вернуть вектор strx из функции crypto чтоб значения передались pthread_join(thread1,(void**)&amp;str1); ...

WebBrowser как вернуть изменённый HTML (JavaScript)
Все хорошего дня! Маленький вопросик. Использую элемент WebBrowser, который отображает некоторый HTML интерфейс, в HTMl вшит код...

Одновременно использовать компонент, измененный классом-перехватчиком, и не измененный, исходный
Здравствуйте. Решил попробовать в своей программе классы-перехватчики. Руководствовался этой статьёй...

19
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
28.04.2017, 08:24
Может стоит вернуть указатель?

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
 
int* func(int *arr, size_t n);
 
int main() {
 
    size_t size = 10;
 
    int *firstArr = new int[size];
 
    for (size_t i = 0; i < size; i++) {
 
        firstArr[i] = i;
 
    }
 
    int *secondArr = func(firstArr, size);
 
    for (size_t i = 0; i < size; i++) {
 
        std::cout
            << secondArr[i]
            << " ";
 
    }
 
    std::cout
        << std::endl;
 
    delete[] firstArr;
    delete[] secondArr;
 
    std::system("PAUSE");
    return EXIT_SUCCESS;
 
}
 
int *func(int *arr, size_t n) {
 
    int *newArr = new int[n];
 
    for (size_t i = 0; i < n; i++) {
 
        newArr[i] = arr[i] + 10;
 
    }
 
    return newArr;
 
}
Добавлено через 1 минуту
Я в delete передаю указатель на участок памяти. В secondArr и в newArr лежат указатели, указывающие на один и тот же участок памяти после выхода из функции, поэтому
C++
1
delete[] secondArr
удалит то, что создано в
C++
1
int *newArr = new int[n];
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.04.2017, 08:30
Почему не вернуть копию?
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
28.04.2017, 08:43
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему не вернуть копию?
В силу своей неопытности не могу ответить на этот вопрос. Расскажите?

Добавлено через 12 секунд
Чем плох мой метод?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.04.2017, 08:52
Цитата Сообщение от Nishen Посмотреть сообщение
В силу своей неопытности не могу ответить на этот вопрос.
Я и не Вам его задавал, а ТС.
У него код именно этого и просит.
Цитата Сообщение от Nishen Посмотреть сообщение
Расскажите?
Конечно.
Цитата Сообщение от Nishen Посмотреть сообщение
Чем плох мой метод?
Вы далее можете просто забыть память освободить,
не говоря уже о исключениях и тому подобном.
В таких случаях возвращают умный указатель,
который гарантирует освобождение, даже если
вызывающая сторона игнорирует возвращаемое значение.

Ну и плюс ко всему это не вектор, как у ТС.
В коде ТС напрашивается такое решение:
C++
1
2
3
4
vector<double> function::freeV(const vector<double> &v, double x)
{
   //...
}
1
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
28.04.2017, 08:57
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы далее можете просто забыть память освободить,
не говоря уже о исключениях и тому подобном.
Да, согласен с Вами.

Цитата Сообщение от Croessmah Посмотреть сообщение
Почему не вернуть копию?
А как быть, если копия очень большая?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.04.2017, 08:59
Цитата Сообщение от Nishen Посмотреть сообщение
А как быть, если копия очень большая?
Так а какая разница?
Вы же руками такую же копию делаете.
Или Вы о том, что будет лишнее копирование?
Так его не будет, RVO/NRVO справится.
В крайнем случае перемещение сработает.
1
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
28.04.2017, 09:02  [ТС]
Nishen, вообще, что-то в этом есть.
Croessmah, ну, если засунуть внутрь vector<double> tmp; Он этот tmp не хочет возвращать...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.04.2017, 09:03
wlmn, а зачем Вы его в динамической памяти выделяете?
C++
1
2
3
4
5
6
vector<double> function::freeV(const vector<double> &v, double x)
{
    vector<double> tmp(N);
    tmp[0] = v[0] * exp(x);
    return tmp;
}
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
28.04.2017, 09:07  [ТС]
Croessmah, наверное, что-то напутал...
Попробую еще раз. Выделял, потому что у меня вот ровно такой код не хотел работать.
Передавал только первый элемент вектора.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.04.2017, 09:10
wlmn, конкретно в этом коде
меняется только первый элемент вектора.
Все остальные будут нулями.
Если Вам нужна копия вектора v с
измененным первым элементом, то так:
C++
1
2
3
4
5
6
vector<double> function::freeV(const vector<double> &v, double x)
{
    vector<double> tmp(v);//создаем копию вектора v
    tmp[0] = v[0] * exp(x);
    return tmp;
}
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
29.04.2017, 22:10  [ТС]
А когда при использовании такой функции удаляется tmp?
Допустим, у меня есть большой двумерный массив векторов. К каждому вектору v[i] я присваиваю результат этой функции v[i] = freeV(v[i], 0);
Или даже я провожу операции с одним вектором, но с разными значениями x.
Эти tmp не будут копиться в оперативной памяти?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.04.2017, 00:45
Цитата Сообщение от wlmn Посмотреть сообщение
А когда при использовании такой функции удаляется tmp?
Когда удаляется локальный объект?
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
30.04.2017, 01:17  [ТС]
nd2, ну вероятно когда выходит из тела функции... не знаю, как это правильно звучит.
Ну т.е. если у меня есть функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double f(vector<double> v)
{
   double x = 0;
   double h = 0;
   for(size_t i = 0; i<100500; i++)
   {
     x+=<feeV(v,x), freeV(v, x+0.0000001)>; /*Типа скалярное умножение - не стал отдельную функцию 
писать, это так, для примера*/
     h+=0.0000001;
   }
 
   return x;
}
Тогда пока вот этот большой-большой цикл у меня не досчитается, и внешняя функция не вернет x, будут появляться и появляться новые tmp и засорять мне оперативную память? Так?

Тогда вариант с new и delete выглядит получше.

Но, насколько я понимаю, new и delete - очень долгие операции. Как бы все это сделать так, чтоб и побыстрее было, и памяти много не жрало?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.04.2017, 01:21
Цитата Сообщение от wlmn Посмотреть сообщение
будут появляться и появляться новые tmp и засорять мне оперативную память? Так?
Не так. Где они у тебя будут появляться?
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
30.04.2017, 01:24  [ТС]
внутри freeV
Но они же и возвращаются в функцию f, стало быть там и существуют...

Добавлено через 1 минуту
ошибся в примере
<freeV(v, x+h), freeV(v, x+2h)>
Так несет больше смысловой нагрузки...
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.04.2017, 01:25
Цитата Сообщение от wlmn Посмотреть сообщение
внутри freeV
Насчёт этого уже сказано (локальный объект).
Цитата Сообщение от wlmn Посмотреть сообщение
Но они же и возвращаются в функцию f, стало быть там и существуют...
Параметры выражения живут до тех пор пока выражение не будет вычислено.
1
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
30.04.2017, 01:26  [ТС]
Оо, мучас грасиас!
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
30.04.2017, 01:29
Лучший ответ Сообщение было отмечено wlmn как решение

Решение

Если используешь то, что возвращает функция по значению, для вычисления выражения, то, после получения результата, возвращаемые значения уничтожаются.
1
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
30.04.2017, 01:30  [ТС]
я понял, спасибо =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.04.2017, 01:30
Помогаю со студенческими работами здесь

Вернуть двухмерный вектор с класса?
Как правильно вернуть матрицу созданною через вектора из класса, в котором она созданная? вот мой код: #include &lt;iostream&gt; ...

Процедуры и функции: получить вектор А * b (A - матрица, b - вектор)
Есть квадратная матрица A порядка n и вектор b с n элементами. Получить вектор А * b. Заранее спасибо)))

Функция: вернуть вектор, в котором есть все числа из исходного вектора v, кроме заданного x
есть вот такая задача ф-цию filter, которая принимает вектор чисел v и аргумент x. Она возвращает вектор, в котором есть все числа из v,...

Как в функции вернуть значение, а потом продолжить работу этой функции?
Есть функция main, которая возвращает определенное значение. Это значение должно вернутся в течении 1.5 секунд. Проблема в том, что в этой...

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?)
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении должна вернуть 0, при ниудачном код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru