Как вернуть vector из функции c

Обновлено: 04.07.2024

Как правильно возвращать вектор из функции - возвращать сам вектор, указатель на него или итератор? "Правильность" интересует с точки зрения оптимального использования ресурсов и хорошего стиля программирования.

361 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков


869 1 1 золотой знак 11 11 серебряных знаков 30 30 бронзовых знаков Передавайте в функцию ссылку на вектор, который вы собираетесь заполнять. @mikillskegg, в данном случае (вектор является полем класса) это неправда. @DarkGenius: Если время жизни вектора — не проблема, конечно возвращайте const ref. Основная проблема C++ и состоит, на мой взгляд, в том, что приходится чересчур много думать об аллокации/деструкции/копировании ресурсов и владении ими. Например, казалось бы, что опасного в конструкции v.push_back(v.back()); ?

Давайте-ка я суммирую дискуссию в комментариях здесь.

Классическим методом является передача пустого вектора по ссылке в функцию, с тем чтобы функция его заполнила.

Затем, если вы уверены, что время жизни вектора, который вы передаёте, достаточно велико (например, вектор является полем класса), то вы можете возвращать ссылку на него. Внимание! При этом вы вводите потенциально опасную зависимость: если сам объект умрёт, ссылка на вектор тоже перестанет быт валидной! Сам объект не может знать, как его используют, и не является ли он, например, временным.

Затем, вы вполне можете вернуть вектор по значению, особенно если вы конструируете его на стеке в самой функции (и значит, не можете вернуть ссылку на него). Это кажется излишним копированием, но на самом деле оптимизатор часто может убрать ненужное копирование используя RVO/NRVO. (Вот ссылкf про это: NRVO in Visual C++ 2005). Тем не менее, иногда эта техника может всё же ведёт к копированию (например, потому, что оптимизатор не волшебник) и показывает плохие результаты.

И ещё: я бы не советовал возвращать итератор. Итераторы в C++ — ещё более хрупкая вещь, чем ссылки: любой чих в сторону вектора может его инвалидировать.

Возврат итератора требует фактического хранения вектора после завершения работы. Т.е. либо вектор должен быть статичным (объявлен с ключевым словом static ), либо как член класса, а возвращать его будет метод, либо получен на вход функции ещё откуда-либо.

С одним лишь итератором многого не сделать: неизвестно, например, сколько ещё элементов после текущего итератора можно прочитать (для этого придётся возвращать пару итераторов, итератор и длину остатка или что-то подобное), нельзя вставить новый элемент или удалить существующий. С другой стороны, итератор концептуально представляет собою позицию в контейнере (плюс вариант отсутствия когда итератор указывает на end ).

Итого: если вам нужна именно семантика указателя на позицию в контейнере, итератор вам подойдёт. В остальных случаях ничего хорошего не выйдет.

Возврат указателя можно разделить на 2 случая: с передачей владения и без (т.е. определить, кто занимается удалением вектора).

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

Если нужно передать владение вектором вызывающему контексту, следует изначально создавать его на куче (с помощью оператора new ). С точки зрения идиоматичного C++ следует использовать умные указатели shared_ptr , unique_ptr или их аналоги из библиотек вроде boost или Qt .

Следует заметить, что в C++11 такой подход довольно бессмыслен, поскольку там существует семантика перемещения (об этом позже). С другой стороны, shared_ptr доступен и в C++03 с TR1. Правда, он может быть не совсем эквивалентен своему собрату из 11 стандарта.

Возврат по значению может вылиться в дорогостоящее копирование, однако:

В C++11 (который на текущий момент с нами уже 4 года, между прочим) существует семантика перемещения, которая позволит вернуть вектор по значению без копирования.

Даже для более старых стандартов многие компиляторы реализуют оптимизации Return Value Optimization и Named Return Value Optimization (подробнее о этих товарищах можно почитать у Алёны C++). Несмотря на то, что большинство компиляторов поддерживают эти оптимизации, могут существовать экзотические / старые компиляторы, не проводящие их.

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

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

Как вывести вектор из функции через адреса или указатели? Можно и внутри вектор создать, его главное вывести.

Пробовал и через return vec. В результате на выходе программы все элементы вектора равны 0. А размер вектора выведен правильно.

Возврат 2 значений из функции с одним вызовом этой же функции
Вообщем где то в какой то игре была хукнута одна функция int function(int arg1,int arg2,int.

Вычисление вектора значений функции для нового вектора аргумента
Здравствуйте господа. При вычислении значений функции для нового вектора вместо значений в "Р".


Возврат функции
Не могу сообразить как в этом коде Страуструпа указать возврат функции return, чтобы выполнились.

Что-то не помогло.
Попробовал написать через указатель:
Nvectro.resize(++num); подозреваю, что проблемма именно в том, что вектор - динамичный.

Спасибо за ответ, в этом месте помогло. Я не знал о таком символе как '->'.

Ниже выскочила другая ошибка при присвоении элементу вектора числа.

Снова то же самое: передали по указателю - обращайтесь по указателю

Помощь в написании контрольных, курсовых и дипломных работ здесь.


Возврат функции
Всем доброго времени суток! Пишу трейд-бота для стима( принимает вещи и отдает их в автоматическом.

возврат функции
Здравствуйте. Мне нужно, чтобы при выборе функции с помощью radiobutton, она была именно как.

Возврат массива из функции
Есть задача: используя функции, вычислить количество элементов заранее введённых массивов, которые.


Возврат значения из функции
Добрый вечер. Не могу вернуть значение из функции после connect(сигнала) или не так делаю. И еще.

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

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

И тут возникла проблема. Если просто создать внутри вектор, то метод ничего и не вернет. Но можно через new

И все прекрасно передается. Только вот не удаляется. Ну т.е. если там в деструкторе прописать delete tmp; он, естественно, и не поймет, что за tmp Как быть?

Как вернуть вектор из функции?
Как вернуть вектор strx из функции crypto чтоб значения передались.


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

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

Вернуть двухмерный вектор с класса?
Как правильно вернуть матрицу созданною через вектора из класса, в котором она созданная? вот мой.

Как вернуть вектор из функции?


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

Передавай в функцию вектор по ссылке, внутри функции меняй в нём всё, что тебе надо, и возвращай из функции ссылку на него же - все изменения будут сохранены:

Чет я не пойму, что да как сделать

только vector а не void

Добавлено через 4 минуты
Мне надо чтоб два потока параллельно шли

ikudesnik, ты в курсе, да, что итераторы работают подобно указателям? То есть, как и в указателях, значение итератора - адрес. А ты им пытаешься присваивать какие-то целые числа (результат целочисленного деления).

ikudesnik, никогда с потоками не работал. Насчёт распараллеливания помочь не могу. Передавай в функцию вектор по ссылке, внутри функции меняй в нём всё, что тебе надо, и возвращай из функции ссылку на него же Если уж передаётся ссылка на вектор, то зачем эту же ссылку и возвращать? Если уж передаётся ссылка на вектор, то зачем эту же ссылку и возвращать? Си-вэй: передавать все что надо только читать - в зависимости от величины типа, все что надо менять - по указателям, а возвращать инт - кот ошибки, 0 если все хорошо. _Ivana, хорош людей с пути истинного совращать, возмутитель спокойствия
Раздел-то С++, а не Си! castaway, ну тут другое. Если правильно понимаю, тут ссылка на поток возвращается, чтобы цепочку из операторов << можно было сделать. gru74ik, не нравится c-way - пишите сразу как casta-way: через классы, поля и методы А то сначала указателей на указатели нарисуют а потом спрашивают как из функций сложные объекты возвращать - вон в соседней теме некто тоже хочет двумерный массив вернуть тут ссылка на поток возвращается, чтобы цепочку из операторов << можно было сделать.

Верно. А вы о чём?

Добавлено через 1 минуту

Си-вэй: передавать все что надо только читать - в зависимости от величины типа, все что надо менять - по указателям, а возвращать инт - кот ошибки, 0 если все хорошо. Если это мне, то я плохо понял что вы имеете в виду. Я о том, что зачем возвращать из функции вектор, который передаётся по ссылке? Для удобства последовательной композиции методов через точку надо конечно возвращать ссылки на объекты, все правильно.

_Ivana, nd2, просто объект проходит "транзитом", всё нормально.

Добавлено через 52 секунды

Я о том, что зачем возвращать из функции вектор, который передаётся по ссылке?

castaway, нет, не Вам, пока постил вы написали свой пост. Это вслух про то, что можно не возвращать передаваемую ссылку и что это даже идиоматично в том ключе, который я привел в пример.

Добавлено через 2 минуты
castaway, да все понятно про объект и транзит. Просто в Си нет методов - поэтому там не так удобно будет, поэтому там си-вэй Хотя можно функцию от функции от . и т.д., но это не так наглядно. Поэтому там сначала создается исходная структура, а потом она меняется процедурами пока ошибка не выскочит или до конца не дойдем.

Читайте также: