Форум программистов, компьютерный форум CyberForum.ru

Сложение элементов двух векторов с записью в третий - C++

Восстановить пароль Регистрация
 
 
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 00:01     Сложение элементов двух векторов с записью в третий #1
Есть код функции (не дописанная), которая получает в качестве аргументов 2 вектора произвольных типов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T> T& vec_func(vector<T>& v, vector<T>& vv) {
    vector<T> local_vec(v.size());
    T sum;
    if (v.size()==vv.size()) {
        for (int i=0; i<v.size(); ++i) {
            local_vec[i] = v[i] + vv[i];
        }   
    }
    if (v.size()!=vv.size()) {
            cout << "The sizes of vectors aren't equal!";
            return -1;
        }
 
}
Функция должна выполнять сложение элементов 2 векторов, и записывать их в 3 вектор.
Вопрос: как изменить функцию, чтоб она возвращала указатель на результирующий вектор. Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Melg
418 / 154 / 62
Регистрация: 23.09.2013
Сообщений: 306
30.03.2014, 02:07     Сложение элементов двух векторов с записью в третий #21
Поскольку в изначальной постановке задачи говорилось именно про возвращение указателя на вектор, я привел именно такую реализацию. В общем случае можно возвращать из функции вектор по значению, тогда единственной платой за эту операцию будет время потраченное на вызов конструктора копирования.

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T> vector<T> addition_of_vectors(vector<T>& first_vector,
        vector<T>& second_vector) {
    vector<T> addition_result_vector;            // Stack allocation start of addition_result_vector life time
    if (first_vector.size() == second_vector.size()) {
        for (int i = 0; i < first_vector.size(); ++i) {
             addition_result_vector[i] = first_vector[i] + second_vector[i];
        }
    } else {
        cout << "The sizes of vectors aren't equal!";
    }
    return addition_result_vector;          // copy constructor call
}                       // end of addition_result_vector lifetime
Немного дополнительной информации http://abc.vvsu.ru/Books/u_programm/page0017.asp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
30.03.2014, 02:11     Сложение элементов двух векторов с записью в третий #22
Sentipar, можно я тоже отвечу?
Указатель - это тоже объект. Он создан с automatic storage duration и память, выделенная для него (sizeof(vector<T>*), допустим 4 байта) будет освобождена в конце области видимости. А вот объект типа vector<T> был выделен в динамической памяти, и его-то память как раз и освобождается вызовом delete. А указатель мы просто скопировали и пользуемся им в другом месте. Адрес-то, который он содержит, не меняется при этом.
Melg
418 / 154 / 62
Регистрация: 23.09.2013
Сообщений: 306
30.03.2014, 02:15     Сложение элементов двух векторов с записью в третий #23
Сообщение было отмечено автором темы, экспертом или модератором как ответ
По поводу указателя ситуация обстоит следующим образом:

C++
1
vector<T> *addition_result_vector = 0;
Создается временный объект типа указатель на vector<T>. Время жизни этого объекта ограничено
C++
1
2
3
{ // scope - областью видимости объекта.
 
}
, он в данный момент указывает на адрес 0.
Этот объект занимает в памяти для 32-битной версии программы 8 байт и может хранить в себе адрес ячейки памяти, чтото вроде 0x8f7d008 - например.
Далее в конце функции вызывается
C++
1
return addition_result_vector;
При том что в объявлении шаблонной функции было указано, что функция возвращает указатель на объект типа vector по значению:
C++
1
2
template<class T> vector<T> * addition_of_vectors(vector<T>& first_vector,
        vector<T>& second_vector)
Таким образом при вызове return - адрес 0x8f7d008 скопируется rvalue переменную, время жизни которой ограничено непосредственным местом вызова функции:
C++
1
2
std::vector<int> *pointer_to_addition_result_vector = /* Вот тут она проживет ровно до точки с запятой*/ addition_of_vectors(
            first_integer_vector, second_integer_vector);
Но поскольку мы вызываем оператор присваивания = - то значение адреса будет уже скопировано в
переменную std::vector<int> *pointer_to_addition_result_vector - которая была объявлена в функции main и время жизни которой ограничено областью видимости внутри main функции. Таким образом - валидная память - за счет того, что объект был выделен в куче оператором new была передана в валидный указатель - с которым далее и идёт работа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 02:20     Сложение элементов двух векторов с записью в третий
Еще ссылки по теме:

Создать третий массив из элементов двух данных C++
C++ Создать класс для обработки векторов разность векторов норму векторов
Слияние двух векторов в третий по условию C++

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

Или воспользуйтесь поиском по форуму:
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 02:20  [ТС]     Сложение элементов двух векторов с записью в третий #24
Melg, DrOffset, Огромное вам спасибо, я всё понял, завтра ещё буду проглядывать ваши коды и комментарии. Очень помогли, честное слово, ибо я уже
А вам
Yandex
Объявления
30.03.2014, 02:20     Сложение элементов двух векторов с записью в третий
Ответ Создать тему
Опции темы

Текущее время: 11:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru