Я пытаюсь получить сумму каждого элемента двух векторов и перенести сумму в новый вектор.

То есть .

A = {1, 2, 3} & b = {1, 2, 3}

С = а + б

С = {2, 4, 6}

У меня это работает для векторов одинакового размера, но всякий раз, когда один из векторов больше другого, я получаю векторный индекс вне ошибки диапазона.

A = {1, 2, 3} & b = {1, 2, 3, 4}

С = а + б

Я предполагаю, что это происходит во время б [3] + ?? Как бы я добавить его, чтобы получить результат:

С = {2, 4, 6, 4}

То, что у меня так далеко, это:

vector<int> a = { 1,2,3,4 };
vector<int> b = { 5,4,3,2,1 };

vector<int> *vPtr;
vPtr = new vector<int>;

int sum;
int size = a.size();
if (size < b.size())
    size = b.size();

for (unsigned i = 0; i < size; i++) {
    sum = a[i] + b[i];
    (*vPtr).push_back(sum);
}

for (vector<int>::const_iterator it = (*vPtr).begin(); it != (*vPtr).end(); it++)
    cout << *it << " ";

cout << endl;

return 0;
2
Lucidity 21 Окт 2017 в 06:45

3 ответа

Лучший ответ

Дополните меньший вектор дополнительными нулями в конце. Вот пример:

int sizeDifference = abs(a.size() - b.size());
if(sizeDifference != 0){
  if(a.size() > b.size())
    for(int i = 0; i<sizeDifference; ++i)
      b.push_back(0);
  else
    for(int i = 0; i<sizeDifference; ++i)
      a.push_back(0);
}
1
Jorge Barrios 21 Окт 2017 в 03:53

Обычно я делаю это с итераторами в трех частях. Часть, где оба вектора имеют общие элементы. Часть if / where a длиннее b, а часть if / where b длиннее a.

std::vector<int> a = {1, 2, 3};
std::vector<int> b = {4, 5, 6, 7};
std::vector<int> c;

// reserve enough space for the longest vector
c.reserve(std::max(a.size(), b.size()));

auto a_itr = std::begin(a);
auto b_itr = std::begin(b);

// for the part where the positions coincide
for(; a_itr != std::end(a) && b_itr != std::end(b); ++a_itr, ++b_itr)
    c.push_back(*a_itr + *b_itr);

// for the part where a is longer than b (if any)
c.insert(std::end(c), a_itr, std::end(a));

// for the part where b is longer than a (if any)
c.insert(std::end(c), b_itr, std::end(b));

for(auto i: c)
    std::cout << i << '\n';
1
Galik 21 Окт 2017 в 04:16
size_type sm_size, lg_size;
vector<int> *lg_vec_ptr;
if (a.size < b.size()) {
   sm_size = a.size();
   lg_size = b.size();
   lg_vector_ptr = &b;
} else {
   sm_size = b.size();
   lg_size = a.size();
   lg_vector_ptr = &a;
}

vector<int> *sum_vec_ptr = new vector<int>;
size_type i;
for (i=0; i<sm_size; ++i)
    sum_vec_ptr->push_back( a[i] + b[i] );
for (   ; i<lg_size; ++i)
    sum_vec_ptr->push_back( lg_vector_ptr->[i] );

Этот метод не изменяет исходные векторы.

0
ikegami 21 Окт 2017 в 04:02