Я пробовал цикл for, но он вычитает каждое число из каждого элемента, а не только из первого.
Вы делаете это неправильно. Вы использовали cascaded
для циклов и, следовательно, вы вычитаете каждый элемент первого vector
из каждого элемента второго vector
.
Существует два способа правильной реализации:
Один включает написание собственных функций для вычитания двух vector
, а затем добавление элементов результата.
#include <iostream>
#include <vector>
std::vector<int> subtract(const std::vector<int>& a, const std::vector<int>& b)
{
std::vector<int> result;
const int SIZE = std::min(a.size(), b.size());
for (int i = 0; i < SIZE; i++)
result.push_back(a[i] - b[i]);
return result;
}
int addAllElements(const std::vector<int>& a)
{
int result = 0;
for (auto i: a)
result += i;
return result;
}
int main(void)
{
std::vector<int> a = {2, 1};
std::vector<int> b = {1, 1};
std::cout << "Result is " << addAllElements(subtract(a, b)) << std::endl;
return 0;
}
Другой метод (предпочтительный) предполагает использование STL
:
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main(void)
{
std::vector<int> a = { 2, 1 };
std::vector<int> b = { 1, 1 };
std::vector<int> result;
std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), [](const auto a, const auto b)
{
return a - b;
}
);
int sumAllElements = std::accumulate(result.begin(), result.end(), 0);
std::cout << "Result is " << sumAllElements << std::endl;
return 0;
}
Приведенный выше код использует lambda expression
. Чтобы узнать о них больше, посмотрите эту ссылку .
std::accumulate
суммирует все элементы container
, а std::transform
выполняет преобразование (указанное в его пятом аргументе) для двух векторов и помещает результат в другой вектор. Мы использовали lambda expression
для выполнения требуемой операции sub
.
РЕДАКТИРОВАТЬ:
Реализовать это без lambda
также легко. Вы можете использовать function pointers
.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
double subtract(const double a, const double b)
{
return a - b;
}
int main(void)
{
std::vector<int> a = { 2, 1 };
std::vector<int> b = { 1, 1 };
std::vector<int> result;
std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), subtract);
int sumAllElements = std::accumulate(result.begin(), result.end(), 0);
std::cout << "Result is " << sumAllElements << std::endl;
return 0;
}
Существуют различные преимущества использования лямбда-выражения.
ПРИМЕЧАНИЕ:
Вы также можете использовать std::minus
вместо определения собственной функции. Как это:
std::transform(std::begin(a), std::end(a), std::begin(b), std::back_inserter(result), std::minus<int>());