Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
#1

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

30.03.2014, 00:01. Просмотров 1319. Ответов 23
Метки нет (Все метки)

Есть код функции (не дописанная), которая получает в качестве аргументов 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 вектор.
Вопрос: как изменить функцию, чтоб она возвращала указатель на результирующий вектор. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 00:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложение элементов двух векторов с записью в третий (C++):

Сложение двух векторов и запись результата в третий вектор - C++
Программа заполняет 2 вектора типа float значениями. После чего вектора складываются и результат сложения записывается в третий вектор. Вот...

Слияние двух векторов в третий по условию - C++
Здравствуйте, подскажите пожалуйста как написать сравнение двух массивов (массив старых и массив новых значений) с записью в третий...

Сложение первого и второго элементов массива и записать результат в третий - C++
создать массив из 5 элементов. Mas-3 ;Mas-4; Mas-1; Mas-5; Mas-2. Произвести сложение первого и второго элементов массива и записать...

Сложение первого и второго элементов массива и записать результат в третий - C++
Cоздать массив из 5 элементов. Mas-4 ;Mas-4; Mas-7; Mas-3; Mas-9. Произвести сложение первого и второго элементов массива и записать...

Как из двух однонаправленных списков создать третий, который состоит из нечетных элементов предыдущих двух? - C++
ребят,подскажите пожалуйста как из двух однонаправленных списка создать третий который состоит из нечетных елементов преведущих двух....

Сложение двух элементов - C++
Здравствуйте! произошла какая то ошибка в коде,а именно...указано внизу ввиде комментария...как исправить? #include &lt;iostream.h&gt; ...

23
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 01:56  [ТС] #16
Тут
C++
1
  addition_result_vector = new vector<T>(first_vector.size());
Или же там всё правильно, потому что поинтер не удаляется до тех пор, пока мы используем его в основном коде?
C++
1
2
3
4
5
6
7
8
9
 if (pointer_to_addition_result_vector) {   //Only if function returned some address
        cout << "Result vector pointer : " << pointer_to_addition_result_vector
                << endl;
        for (int i = 0; i < (*pointer_to_addition_result_vector).size(); ++i) {
 
            cout << "result[" << i << "] = "
                    << (*pointer_to_addition_result_vector)[i] << endl;
        }
        delete pointer_to_addition_result_vector; // prevent memory leaks
Добавлено через 3 минуты
Melg, Нашёл ошибку в коде. Вместо
C++
1
(*addition_result_vector)[i] = first_vector[i] + second_vector[i];
писал
C++
1
*(addition_result_vector)[i] = first_vector[i] + second_vector[i];
Всем огромное спасибо, тебе особенно
0
DrOffset
7388 / 4465 / 1013
Регистрация: 30.01.2014
Сообщений: 7,319
30.03.2014, 01:59 #17
Цитата Сообщение от Sentipar Посмотреть сообщение
Вопрос: как изменить функцию, чтоб она возвращала указатель на результирующий вектор
В дополнение к сказанному, можно еще применить вот такой подход (заодно избежать проблем с освобождением памяти):
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
template<class T>
vector<T> * vec_func(vector<T> & result
                     , vector<T> const & first_vector
                     , vector<T> const & second_vector)
{
    size_t firstSize = first_vector.size();
    if (firstSize == second_vector.size())
    {
        result.resize(firstSize);
        for (size_t i = 0; i < firstSize; ++i)
        {
            result[i] = first_vector[i] + second_vector[i];
        }
    }
    else
    {
        cout << "The sizes of vectors aren't equal!";
    }
    return &result;
}
 
int main(int argc, char* argv[])
{
    vector<int> a;
    //....
    vector<int> b;
 
    vector<int> res;
    //...
    vector<int> * resP = vec_func(res, a, b);
}
1
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 01:59 #18
C++
1
addition_result_vector = new vector<T>(first_vector.size());
Оператор new выделяет память на куче, необходимую для хранения объекта класса vector<T> - где T параметр шаблона, который будет выяснен на этапе компиляции, кроме того new вызывает конструктор класса vector.
В перменную addition_result_vector будет записан адрес по которому находится объект.
Время жизни этого объекта не зависит от места где он был создан, но программист должен самостоятельно решить когда этот объект больше не нужен, и передав указатель на область памяти где находится объект - вызвать оператор delete
2
DrOffset
7388 / 4465 / 1013
Регистрация: 30.01.2014
Сообщений: 7,319
30.03.2014, 02:01 #19
Цитата Сообщение от Sentipar Посмотреть сообщение
Или же там всё правильно, потому что поинтер не удаляется до тех пор, пока мы используем его в основном коде?
Да. Мы сами решаем, когда вызвать delete. А до тех пор можно пользоваться объектом.
1
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 02:03  [ТС] #20
Melg, А разве созданный указатель
C++
1
addition_result_vector = new vector<T>(first_vector.size());
не считается локальным и не будет удален при выходе с области видимости? И если да, то почему?
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
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
1
DrOffset
7388 / 4465 / 1013
Регистрация: 30.01.2014
Сообщений: 7,319
30.03.2014, 02:11 #22
Sentipar, можно я тоже отвечу?
Указатель - это тоже объект. Он создан с automatic storage duration и память, выделенная для него (sizeof(vector<T>*), допустим 4 байта) будет освобождена в конце области видимости. А вот объект типа vector<T> был выделен в динамической памяти, и его-то память как раз и освобождается вызовом delete. А указатель мы просто скопировали и пользуемся им в другом месте. Адрес-то, который он содержит, не меняется при этом.
1
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
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 была передана в валидный указатель - с которым далее и идёт работа.
1
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 02:20  [ТС] #24
Melg, DrOffset, Огромное вам спасибо, я всё понял, завтра ещё буду проглядывать ваши коды и комментарии. Очень помогли, честное слово, ибо я уже
А вам
0
30.03.2014, 02:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 02:20
Привет! Вот еще темы с ответами:

Создать третий массив из элементов двух данных - C++
Подскажите, пожалуйста, как сформировать массив С между А и В #include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; void...

Построить вектор из общих элементов двух векторов - C++
Помогите с написание программы, нет идей вообще :( Задано два вектора действительных чисел х и у, каждый из которых имеет n элементов....

Сравнение двух векторов <string>, удаление повторяющихся элементов - C++
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;iterator&gt; # include &lt;string&gt; # include &lt;fstream&gt; # include &lt;cstdio&gt; #...

Объединение двух массивов в третий (без добавления дублирующихся элементов) - C++
Итак, есть нужно объеденить 2 массива в 3й так что бы элементы которые повторяются в обоих массивах не добавлялись, т.е. a={1,2,3}...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.