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

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

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

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

30.03.2014, 00:01. Просмотров 1304. Ответов 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
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
30.03.2014, 00:14 #2
Написать прототип можно
C++
1
2
template<class T> 
typename vector<T>::iterator vec_func(vector<T>& v, vector<T>& vv)
Но нужно помнить, local_vec который вы создали в функции, по выходу из нее будет недоступен. По этому с итератором (указателем для вектора) тут вряд ли получится. Или передавать его в аргумент функции или возвращать весь вектор.
0
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 00:18  [ТС] #3
Я ещё не дошёл до typename да и в итераторах толком не разобрался, не могли бы вы написать пример кода, каким он должен быть, что бы данная функция работала по предназначению?
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 00:21 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T> vector<T> * addition_of_vectors(vector<T>& first_vector,
        vector<T>& second_vector) {
    vector<T> *addition_result_vector = 0; // = NULL; or = nullptr; depends on using c++ standart
    if (first_vector.size() == second_vector.size()) {
        addition_result_vector = new vector<T>(first_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;
}
Пожалуйста.
0
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 00:36  [ТС] #5
А как, к примеру, вызвать эту функцию, а то у меня пока что с трудом выходит?
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 00:52 #6
Прошу прощения, в моём коде была допущена ошибка, вместо строки:

C++
1
 addition_result_vector[i] = first_vector[i] + second_vector[i];
Должна быть написана строка:

C++
1
(*addition_result_vector)[i] = first_vector[i] + second_vector[i];
Поскольку теперь addition_result_vector - указатель на вектор - то необходимо разыменовать его, для получения
доступа к самому объекту вектора.

Пример вызова этой функции может выглядеть следующим образом:

C++
1
2
3
4
5
6
7
8
9
    std::vector<int> first_integer_vector;
    first_integer_vector.push_back(5);
    first_integer_vector.push_back(20);
    std::vector<int> second_integer_vector;
    second_integer_vector.push_back(11);
    second_integer_vector.push_back(3);
 
    std::vector<int> *pointer_to_addition_result_vector = addition_of_vectors(
            first_integer_vector, second_integer_vector);
1
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 01:04  [ТС] #7
Сделал такой вариант, но он всё равно не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T> vector<T>& sum_of_vectors(vector<T>& first, vector<T>& second) {
    vector<T> some_vector(first.size());
    if (first.size() == second.size()) {
        for (int i=0; i<first.size(); ++i) {
            some_vector[i] = first[i] + second[i];
        }
 
    }
    else {
        cout << "Sizes of vector are not equal!"; 
        return -1;
    }
    return some_vector;
}
при вызове:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() {
    vector<int> v1;
    vector<int> v2;
    for (int i=0; i<5; ++i) {
        v1.push_back(i*2);
        v2.push_back(i*3);
    }
 
 
    vector<int> some_one = sum_of_vectors(v1, v2);
    
 
    system("pause");
        
}
Добавлено через 7 минут

Добавлено через 23 секунды
Извините, но у меня похоже и эта версия не работает. Программа просто ничего не делает, как будто функция даже и не вызывается.

Добавлено через 40 секунд
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 01:19 #8
Опишите конкретно, что именно "не работает" в вашем собственном примере - какие симптомы, и кроме того - опишите каким образом вы пытаетесь оценить работоспособность моей версии? В частности пробывали ли вы вызывать функцию передав вектора разной длины (по крайней мере у меня этот вариант успешно ругнулся сообщением в консоль).

C++
1
2
template<class T> vector<T>& sum_of_vectors(vector<T>& first, vector<T>& second) {
    vector<T> some_vector(first.size());
и далее :
C++
1
2
3
    return -1;
    }
    return some_vector;
Этот код не является корректным. В объявлении Вашей функции Вы указываете, что возвращаемое значение есть ссылка на объект типа вектор:
C++
1
vector<T>&
При этом в определении функции вы пишете в качестве возвращаемого значения -1 - в лучшем случае может произойти следующее - для минус единицы будет осуществлена попытка приведения типа от константного знакового целочисленного к типу вектор знаковых целочисленных :
C++
1
 const int  к vector<int>
Кроме того возвращая some_vector - Вы возвращаете ссылку на временный объект, время жизни этого объекта связано с областью видимости (scope) - которая в данном случае ограничена телом функции. После завершения вызова и выхода из функции объект вектора будет уничтожен, а дальнейшая работа с сылкой на этот объект может привести к непредсказуемому поведению программы.
1
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 01:36  [ТС] #9
Благодарю за столь исчерпывающий ответ. Проблема в том, что при вызове вашего варианта функции:
C++
1
vector<int>* some_vector = addition_of_vectors(v1, v2);
у меня ничего не происходит (программа не реагирует), даже если я введу разные размеры векторов:
C++
1
2
3
4
5
6
7
8
9
vector<int> v1;
vector<int> v2;
    for (int i=0; i<5; ++i) {
        v1.push_back(i*2);
    }
 
    for (int i=0; i<6; ++i) {
        v2.push_back(i*3);
}
Добавлено через 1 минуту
Благодарю за столь исчерпывающий ответ. Проблема в том, что при вызове вашего варианта функции:
C++
1
vector<int>* some_vector = addition_of_vectors(v1, v2);
у меня ничего не происходит (программа не реагирует), даже если я введу разные размеры векторов:
C++
1
2
3
4
5
6
7
8
9
vector<int> v1;
vector<int> v2;
    for (int i=0; i<5; ++i) {
        v1.push_back(i*2);
    }
 
    for (int i=0; i<6; ++i) {
        v2.push_back(i*3);
        }
Мне нужно в результате вывести значение массива, на который ссылается указатель
C++
1
vector<int>* some_vector
на экран с помощью std::cout.
Благодарю за помощь.

Добавлено через 5 минут
И ещё 1 вопрос: разве не нужно освобождать память при использовании "голого" new?
C++
1
 addition_result_vector = new vector<T>(first_vector.size());
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.03.2014, 01:45 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
template <typename T>
std::vector<T>* vec_fun(const std::vector<T>& v, const std::vector<T>& v2)
{
    std::vector<T>* local_vec = new std::vector<T>(v.size());
    
    /* some code */
    
    return local_vec;
}
А ты пиши потом вместо local_vec вот это (*local_vec)
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
30.03.2014, 01:45 #11
Цитата Сообщение от Sentipar Посмотреть сообщение
разве не нужно освобождать память при использовании "голого" new?
Нужно.
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 01:47 #12
Я написал тест и попробовал его запустить онлайн компилятором, ссылка прилагается:
http://ideone.com/8E1ieM
1
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 01:47  [ТС] #13
Тогда там допущена ошибка, я прав?
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
30.03.2014, 01:49 #14
Цитата Сообщение от Sentipar Посмотреть сообщение
Тогда там допущена ошибка, я прав?
Там - это где именно?
1
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
30.03.2014, 01:50 #15
Безусловно память выделенная под объекты (с помощью оператора new) в куче (heap) - требует прямого управления программистом, после использования объекта необходимо вызвать delete передав адрес объекта в памяти. Попробуйте посмотреть на тот код, ссылку на который я дал выше - по крайней мере этот онлайн компилятор не выдает никаких сообщений об ошибках, и, на сколько я могу судить, ход выполнения соответствует поставленной задаче.
1
30.03.2014, 01:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 01:50
Привет! Вот еще темы с ответами:

Создать третий массив из элементов двух данных - 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}...


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

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

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