Каковы хорошие способы найти сумму всех элементов в std::vector ?
Предположим, что у меня есть вектор std::vector vector с несколькими элементами в нем. Теперь я хочу найти сумму всех элементов. Каковы разные способы для этого?
На самом деле существует довольно много методов.
Классический для цикла:
Использование стандартного алгоритма:
Будьте осторожны с накоплением. Последний тип аргумента используется не только для начального значения, но и для типа результата. Если вы поместите int туда, он будет накапливать int, даже если вектор имеет float. Если вы суммируете числа с плавающей запятой, измените 0 на 0.0 или 0.0f (благодаря nneonneo).
Видео:Сумма элементов массива РЕКУРСИЯ C# | СИ ШАРП ДОМАШНИЕ ЗАДАНИЯ # 16Скачать
С++ 11 и выше
Использование цикла, основанного на диапазоне (спасибо Roger Pate):
Prasoon уже предложил множество различных (и хороших) способов сделать это, ни один из которых не нужно повторять здесь. Однако я хотел бы предложить альтернативный подход к скорости.
Если вы собираетесь делать это совсем немного, вы можете рассмотреть возможность “подклассификации” вашего вектора, чтобы сумма элементов поддерживалась отдельно (а не вектором подклассификации, что сомнительно из-за отсутствия виртуальный деструктор – я говорю больше о классе, который содержит сумму и вектор внутри него, has-a , а не is-a , и предоставляет вектороподобные методы).
Для пустого вектора сумма устанавливается равной нулю. При каждой вставке в вектор добавляйте вставляемый элемент в сумму. На каждом удалении вычтите это. По сути, все, что может изменить базовый вектор, перехватывается, чтобы обеспечить постоянство суммы.
Таким образом, у вас есть очень эффективный метод O (1) для “вычисления” суммы в любой момент времени (просто верните вычисленную в данный момент сумму). Вставка и удаление займет немного больше времени, так как вы корректируете общее значение, и вы должны учитывать этот показатель эффективности.
Векторы, в которых сумма требуется чаще, чем вектор, который можно изменить, – это те, которые могут выиграть от этой схемы, поскольку стоимость расчета суммы амортизируется по всем доступам. Очевидно, что если вам нужна только сумма каждый час, а вектор меняется три тысячи раз в секунду, она не подойдет.
Что-то вроде этого будет достаточно:
Очевидно, что этот псевдокод и вам может потребоваться немного больше функциональности, но он показывает основную концепцию.
Зачем выполнять суммирование вперед, когда вы можете сделать это назад? Дано:
Мы можем использовать индексирование, считая назад:
Мы можем использовать “подписи”, проверенные по диапазону, “отсчет назад (на всякий случай):
Мы можем использовать обратные итераторы в цикле for:
Мы можем использовать итераторы вперед, итерации назад, в цикле for (oooh, tricky!):
Мы можем использовать accumulate с обратными итераторами:
Мы можем использовать for_each с выражением лямбда с использованием обратных итераторов:
Таким образом, как вы можете видеть, существует так же много способов суммирования вектора назад, как и для того, чтобы суммировать вектор вперед, а некоторые из них гораздо более захватывают и предлагают гораздо большую возможность для ошибок по отдельности.
Самый простой способ – использовать std:accumuate vector A :
Я пользователь Perl, игра, которую мы имеем, состоит в том, чтобы найти всевозможные способы увеличения переменной… что здесь совсем не так. Ответ на то, сколько способов найти сумму элементов вектора в С++, вероятно, an infinity …
Используя BOOST_FOREACH, чтобы освободиться от уродливого синтаксиса итератора:
итерирование по индексам (очень легко читается).
Этот другой является деструктивным, доступ к вектору, как стек:
Это похоже на BOOST_FOREACH, упомянутый в другом месте, и имеет то же преимущество ясности в более сложных ситуациях, по сравнению с функторами состояния, используемыми с накоплением или for_each.
Можно также использовать std:: valarray, как этот
Некоторые из них могут оказаться неэффективными, поскольку размер valarray должен быть таким же большим, как размер вектора, и инициализация valarray также займет время.
В этом случае не используйте его и возьмите его как еще один способ суммирования последовательности.
Я нашел самый простой способ найти сумму всех элементов вектора
В этой программе у меня есть вектор размером 10 и инициализируется 1. Я вычислил сумму простым циклом, как в массиве.
Это легко. С++ 11 предоставляет простой способ суммировать элементы вектора.
Видео:C++ | Сложение элементов массиваСкачать
Сумма элементов в векторе?
Как бы найти сумму элементов в векторе, который был введен пользователем? Я пытался найти способ сделать это везде в Интернете, но не смог найти такого онлайн, который бы объяснил это очень хорошо, и, к сожалению, он не был слишком объяснен в классе.
Таким образом, я в основном имею векторы, введенные пользователем здесь, но я понятия не имею, как использовать его, чтобы взять его сумму? (printvector присутствует только там, потому что я должен представить то, что пользователь положил пользователю, прежде чем сообщать пользователю сумму)
Видео:accumulate c++ | сумма и произведение элементов массива | Библиотека (stl) C++ #19Скачать
Решение
(Использование вашего стиля для функции, а не современного C ++.)
Видео:НАЙТИ СУММУ ЧЕТНЫХ ЧИСЕЛ В МАССИВЕ C# | РАБОТА С МАССИВАМИ | СИ ШАРП УРОКИ | ДОМАШНИЕ ЗАДАНИЯ # 8Скачать
Другие решения
Ты можешь использовать std::accumulate() ,
accumulate() функция действительно просто левый сгиб , и по умолчанию он использует + функция для объединения элементов.
Видео:Вектор. Сложение и вычитание. 9 класс | МатематикаСкачать
Как суммировать элементы вектора C++?
Что такое хороший способы нахождения суммы всех элементов std::vector ?
Предположим у меня есть вектор std::vector vector с несколькими элементами в нем. Теперь я хочу найти сумму всех элементов. Что такое разные способы для одного и того же?
Видео:Информатика 9 класс. ВЫЧИСЛЕНИЕ СУММЫ ЭЛЕМЕНТОВ МАССИВА (УМК БОСОВА Л.Л., БОСОВА А.Ю.)Скачать
8 ответов
на самом деле существует довольно много методов.
обычный цикл for:
используя стандартный алгоритм:
будьте осторожны с аккумулировать. тип последнего аргумента используется не только для начального значения, но и для типа результата. Если вы поместите туда int, он будет накапливать ints, даже если вектор имеет плыть. Если вы суммируете числа с плавающей запятой, измените 0 to 0.0 или 0.0f (спасибо nneonneo).
Видео:Пример программы для нахождения суммы отрицательных элементов массива. Программирование на С++Скачать
C++11 и выше
использование диапазона на основе цикла for (благодаря Роджеру Пейту):
Прасун уже предложил множество различных (и хороших) способов сделать это, ни один из которых не нужно повторять здесь. Однако я хотел бы предложить альтернативный подход к скорости.
Если вы собираетесь делать это совсем немного, вы можете рассмотреть вопрос о «подклассе» вашего вектора, чтобы сумма элементов поддерживалась отдельно (не на самом деле вектор подкласса, который является неопределенным из — за отсутствия виртуального деструктора- я говорю больше о классе, который содержит сумму и вектор внутри нее, has-a , а не is-a , и предоставляет векторные методы).
для пустого вектора сумма равна нулю. При каждой вставке в вектор добавьте вставляемый элемент в сумму. При каждом удалении вычтите его. В основном, что-нибудь, который может изменить базовый вектор, перехватывается, чтобы обеспечить согласованность суммы.
таким образом, у вас есть очень эффективный метод O (1) для «вычисления» сумма в любой момент времени (просто верните сумму, рассчитанную в данный момент). Вставка и удаление займет немного больше времени, как вы регулируете общую сумму, и вы должны принять во внимание эту производительность хит.
векторы, где сумма необходима чаще, чем вектор изменяется, являются теми, которые, вероятно, выиграют от этой схемы, так как стоимость расчета суммы амортизируется по всем доступам. Очевидно, если вам нужна только сумма каждый час, а вектор меняется на три тысячи раз в секунду, это не подходит.
что-то вроде этого было бы достаточно:
очевидно, что это псевдо-код и вам может потребоваться немного больше функциональности, но он показывает основную идею.
Зачем выполнять суммирование вперед, когда вы можете это сделать назад? Дано:
мы можем использовать знак, обратный отсчет:
мы можем использовать диапазон-проверено «знак,» обратный отсчет (на всякий случай):
мы можем использовать обратные итераторы в цикле for:
мы можем использовать прямые итераторы, итерации назад, в цикле for (oooh, tricky!):
мы можем использовать accumulate с обратными итераторами:
можно использовать for_each С лямбда-выражением с использованием обратных итераторов:
Итак, как вы можете видеть, существует столько же способов суммировать вектор назад, сколько и суммировать вектор вперед, и некоторые из них гораздо более увлекательны и предлагают гораздо больше возможностей для ошибок off-by-one.
💥 Видео
Как найти сумму элементов массива с помощью Java Script i цикла FORСкачать
Задачи с массивами | Pascal | Сумма и поиск элементовСкачать
8 класс, 43 урок, Сумма двух векторовСкачать
Работа с массивом в 1С: считаем сумму элементов массиваСкачать
Сумма элементов массива на c++Скачать
Вычисление суммы элементов массива // информатика 9 классСкачать
Сумма всех элементов массива в C#Скачать
Урок 28 - Суммирование элементов массива в Java. Evil NerdСкачать
программа вычисления суммы элементов массиваСкачать
Найти сумму элементов массива // Find the sum of array elements C#Скачать
Язык C++ с нуля | #33 Найти максимальный и минимальный элемент массива в c++Скачать
Найти минимальный элемент массива. Поиск минимального элемента в массиве. C++ для начинающих. ДЗ#8.Скачать
Язык Си. #096. Сумма элементов массива.Скачать