Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с возвращением значения вектора

281
15 марта 2007 года
Fan][
279 / / 19.12.2003
В main.cpp объявлен вектор.
По ходу процесса в функции, которая используется в main.cpp и которая принимает этот вектор как параметр, происходит заполнение этого вектора.
Но при выходе из функции вектор остаётся пустым.
Почему?
1.8K
15 марта 2007 года
k3Eahn
365 / / 19.12.2005
Приведи код (или хотя бы сигнатуру) этой функции.
320
15 марта 2007 года
m_Valery
1.0K / / 08.01.2007
По ссылке передавай вектор.Как то так:
Код:
#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

void func(vector<int> &vec);
int _tmain(int argc, _TCHAR* argv[])
{
    int size = 10;
    vector<int> vec(size);// заполнен 0
    func(vec);
    cout<<endl;
    for(int i = 0;i<10;++i)
        cout<<vec<<' ';
        cout<<endl;
        return 0;
}
void func(vector<int> &vec)
{
    for(int i = 0;i<vec.size();++i)
        vec = i;
}

Вектор в ф-ию лучше передавать по ссылке,поскольку при передаче по
значению вектор со всеми элементами копируется в стек вызванной
ф-ии,что неэффективно.Если передашь по значению вектор останется
заполненный 0.
63
15 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: m_Valery

Вектор в ф-ию лучше передавать по ссылке,поскольку при передаче по
значению вектор со всеми элементами копируется в стек вызванной
ф-ии,что неэффективно.Если передашь по значению вектор останется
заполненный 0.


Совершенно верно, но только хотел бы уточить - не лучше по ссылке, а необходимо по ссылке:). В зависимости от логики, можно так же создавать вектор внутри функции и возвращать его.

309
16 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
В зависимости от логики, можно так же создавать вектор внутри функции и возвращать его.


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

63
16 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: el scorpio
Долго и накладно. Для входящих значений "тяжёлых" контейнеров нужно передавать константную ссылку на объект, а для исходящих - изменяемую.


В принципе, согласен, только есть некоторые неясные мне моменты.
1) "Тяжесть" контейнера определяешь на глаз? Экспериментально?
2) Насчет изменяемой ссылки - так тогда, если я тебя правильно понял, перед вызовом надо проверить существование корректного вектора, если надо, отслеживать возможные изменения его функцией, хотя бы на предмет исключений, в общем - логика вызываюшей стороны связывается еще больше с внутренней логикой функции. Это не есть хорошо, думаю:), особенно учитывая, что по философии STL корректность аргументов обеспечивается вызывающей стороной.. И для, так сказать, лучшей масштабируемости, иногда стоит пренебречь этой возможностью.

309
17 марта 2007 года
el scorpio
1.1K / / 19.09.2006
1. Если sizeof больше 4 - уже тяжёлый :D. А также если имеется указатель на массив, который нужно сначала выделить, скопировать значения, а потом удалить.
По второму пункту - что означает этот набор фраз? Любой "контейнер" - это объект, который обязан сам обеспечивать всю рутину по работе с вложенной информацией.
63
17 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: el scorpio

По второму пункту - что означает этот набор фраз? Любой "контейнер" - это объект, который обязан сам обеспечивать всю рутину по работе с вложенной информацией.


Я имел в вижу следующее - читаем твой пост:

Цитата: el scorpio

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


Мои вопросы как раз взаимосвязны -

Цитата:

В зависимости от логики, можно так же создавать вектор внутри функции и возвращать его.


Конечно, для тяжелого контейнера передавать его по значению накладно. Но для "легких" и средних - нормально:)
Пусть теперь мы передаем изменяемую ссылку, чтобы туда что-то запихнуть в теле функции. С точки зрения производительности - выгоднее передавать по ссылке. Но тогда эту ссылку надо будет передавать функции, чего можно было бы избежать, если контейнер создавать в теле функции (статически), и вернуть. И функция принимает одним параметром меньше:).

3
17 марта 2007 года
Green
4.8K / / 20.01.2000
Цитата: Zorkus

Конечно, для тяжелого контейнера передавать его по значению накладно. Но для "легких" и средних - нормально:)


Теперь я задам всё тот же вопрос: как вы определяете "тяжесть контейнера"?

Есть одно золотое правило (за невыполнение которого, бью по рукам): ЛЮБЫЕ ОБЪЕКТЫ передаются по константной ссылке, а не по значению.

Цитата: Zorkus

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


Принимает одним параметром меньше, головной боли в десять раз больше.
Ещё одно правило: не возвращайте из функций ссылки на статические переменные, замучаетесь отлавливать ошибки (а в многопоточных приложениях вообще не отловите).
Кроме того, как думаешь, что накладнее с точки производительности: передать один параметр или сконструировать объект?

63
17 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Green
Теперь я задам всё тот же вопрос: как вы определяете "тяжесть контейнера"?


Я первый спросил:) Ну вот скажем, 1000 int- значений вектор, исключительно для примера. Это какой? С точки зрения потерь производительности. Понятно, что это очень относительное понятие, но все же?

Цитата: Green

не возвращайте из функций ссылки на статические переменные, замучаетесь отлавливать ошибки (а в многопоточных приложениях вообще не отловите).


Согласен:).
Но я, во-первых, не имел в виду многопоточные приложения, когда говорил. Во-вторых - я как раз не призываю возвращать из функции такии ссылки. Где ты это увидел в моем посте?

Цитата: Green

Кроме того, как думаешь, что накладнее с точки производительности: передать один параметр или сконструировать объект?


Я знаю, о чем тут и сказал. -

Цитата:
С точки зрения производительности - выгоднее передавать по ссылке

Я не из-за производительности я начал спор - понятно, что передача по значению проигрывает. А про то, что такая, как ты говоришь, функция больше от вызыв. кода зависит.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог