Операция сложения векторов - PullRequest
       12

Операция сложения векторов

1 голос
/ 04 сентября 2010

Я пытаюсь добавить два вектора ниже, это фрагмент кода: -

#include <iostream>
#include <vector>
using namespace std;

int main()
{
        unsigned int i = 0;
        vector <float> v1;
        vector <float> v2;
        vector <float> v3;



        cout << "Filling the Numbers\n";
        for (i=5;i < 125 ; i = i + 5) {
            v1.push_back(i/10);
            v2.push_back(i/100);
        }

        cout << "Adding the numbers\n";
        for (i = 0; i < v1.size(); i++) {
                v3[i] = v1[i] + v2[i];
        }

        cout << "Printing the numbers\n";
                for (i = 0; i < v3.size() ; i++) {
                        cout << v3[i];
                }


        return 0;
}

Программа вылетает в строке 18. Мне кажется, мне нужно перегрузить оператор для операции +. Пожалуйста, помогите.

Ответы [ 6 ]

8 голосов
/ 04 сентября 2010

Чтобы избежать очевидных ошибок, с которыми вы столкнулись, вы можете сделать это в качестве альтернативы:

#include <algorithm> // for transform
#include <functional> // for plus

std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(v3), std::plus<float>());

Ссылка: https://en.cppreference.com/w/cpp/algorithm/transform

8 голосов
/ 04 сентября 2010

Эта строка не работает, поскольку v3[i] не выделено:

v3[i] = v1[i] + v2[i];

У вас есть два варианта: либо использовать push_back

v3.push_back( v1[i] + v2[i] );

, либо изменить размер массивадо заданного размера перед рукой:

v3.resize( v1.size() );

Если вы нажмете_бэк, было бы неплохо предварительно выделить место в любом случае:

v3.reserve( v1.size() );

И, наконец, вы можете попробовать прочитать std::valarray вместо этого, поскольку эти операции уже встроены в него!

Редактировать: и да, как отметил Йоханнес, у вас есть проблема с делением с плавающей запятой:>

4 голосов
/ 04 сентября 2010

Сначала вам нужно выполнить деление с плавающей запятой

v1.push_back(i/10.0f);
v2.push_back(i/100.0f);

Затем вам нужно выделить место для i переменных на v3 или использовать push_back

v3.push_back(v1[i] + v2[i]);
1 голос
/ 04 сентября 2010

Я думаю, проблема в том, что v3 [i] не работает, поскольку вектор начинается с нуля элементов.То, что вы хотите сделать, это либо:

v3.push_back( v1[i] + v2[i] );

, либо предварительно выделить вектор

v3.resize( v1.size() );

ИЛИ окончательное решение, которое я бы сделал:это позволяет избежать изменения размера вектора снова и снова.

1 голос
/ 04 сентября 2010

Вы записываете в вектор v3, но для него не выделено места.

Попробуйте добавить:

 v3.reserve (v1.size());

между вашей первой и второй петлей.

1 голос
/ 04 сентября 2010

v3[i] = v1[i] + v2[i];

Вы присваиваете элементам, которые не существуют. Попробуйте v3.push_back(v1[i] + v2[i]); вместо.

Кроме того, вы, вероятно, хотите i/10.0 вместо i/10, в противном случае ваши результаты округляются.

...