Получить сумму вектора - PullRequest
       2

Получить сумму вектора

1 голос
/ 05 октября 2019

Как мне вернуть сумму этого векторного массива целых чисел? Приведенный ниже код возвращает неправильное значение.

int simpleArraySum(vector<int> ar) {
    int sum = 0;
    int length = sizeof(ar);
    for (int i = 0; i < length; i++){
        sum += ar[i];
    }
    return sum;

}

Ответы [ 2 ]

3 голосов
/ 05 октября 2019

Для начала вектор должен быть передан в функцию по ссылке. В противном случае будет создана избыточная копия вектора. Более того, параметр должен быть объявлен с постоянной ссылкой, поскольку сам вектор не изменяется в функции.

Для суммы следует использовать тип long long int, поскольку не исключено, что может быть переполнение.

Эта декларация

int length = sizeof(ar);

не имеет смысла. Переменная length сохраняет размер объекта типа std::vector<int>, а не количество элементов, хранящихся в векторе.

Таким образом, функцию можно определить, например, следующим образом:

long long int simpleArraySum( const std::vector<int> & ar )
{
    long long int sum = 0;

    for ( const auto &item : ar ) sum += item;

    return sum;
}

Другой подход заключается в использовании стандартного алгоритма std::accumulate, объявленного в заголовке <numeric>. Например

#include <vector>
#include <iterator>
#include <numeric>

//...

long long int simpleArraySum( const std::vector<int> & ar )
{
    return std::accumulate( std::begin( ar ), std::end( ar ), 0ll );
}
1 голос
/ 05 октября 2019

Использование std::accumulate:

int simpleArraySum(vector<int> ar) {
    return std::accumulate(ar.begin(), ar.end(), 0);
}

В любом случае, ваша length инициализация неверна, она должна быть:

int length = ar.size();

Если вывсе еще имеют неожиданные результаты, вероятно, что вы либо находитесь в / 1013 * ниже (вероятно, используете более широкий тип), либо у вас слишком много элементов, чтобы поместиться в int (маловероятно, переключитесь на std::size_t иливместо этого используйте цикл диапазона).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...