Как вычесть первый элемент в векторе из другого первого элемента в другом векторе? - PullRequest
1 голос
/ 02 ноября 2019

У меня есть 2 вектора целых.

скажем, первый имеет (2,1). и второй (1,1).

Я пытаюсь вычесть числа, как это:

2 - 1, 1 - 1

затем мне нужно добавить эти2 числа, поэтому окончательный ответ будет 1.

Я пробовал цикл for, но он вычитает каждое число из каждого элемента, а не только из первого.

Это то, что яДо сих пор пробовал.

vector<int> temp;

for(unsigned i =0; i < Vec1.size(); i++)
 for(unsigned o =0; o < Vec2.size(); o++)
   temp.push_back(Vec1.at(i).nums- Vec2.at(o).nums);

//where nums, are just the numbers showed above

Результат, как и следовало ожидать: 1

1

0

0

и мне нужно, чтобы оно было:

1

0

тогда я могу просто сделать цикл for, чтобы сложить все целые числа вместе.

Anyпомощь, будет принята с благодарностью!

Ответы [ 3 ]

4 голосов
/ 02 ноября 2019

Я пробовал цикл 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>());
3 голосов
/ 02 ноября 2019

В C ++ 17 вы можете комбинировать std::transform и std::reduce / std::accumulate вызовы с std::transform_reduce:

const std::vector<int> vec1 {2, 1};
const std::vector<int> vec2 {1, 1};
auto res = std::transform_reduce(vec1.begin(), vec1.end(),
                                 vec2.begin(),
                                 0,
                                 std::plus<>(),
                                 std::minus<>());

Демо

2 голосов
/ 02 ноября 2019

Вот пример использования STL:

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> vec1 {2, 1};
    std::vector<int> vec2 {1, 1};
    std::vector<int> temp;
    std::transform(begin(vec1), std::end(vec1), std::begin(vec2),
        std::back_inserter(temp), [](const auto a, const auto b) {return a - b;});
    auto sum = std::accumulate(temp.begin(), temp.end(), 0);
    std::cout << "Result: " << sum << "\n";
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...