LINUX.ORG.RU

MappedSum есть где нибудь?

 


0

1

Надо обьект, который будет предоставлять интерфейс подобный std::map<int, int> но при том держать/актуализировать сумму всех значений.

template <typename Element, auto... keys>
class MappedSum;

enum Keys { ONE, TWO, THREE };
MappedSum<int, ONE, TWO, THREE> sum = 0.0;

sum[TWO] = 10;
sum[THREE] = 3;
assert(sum == 13); // 0 + 10 + 3

sum[ONE] = -4;
assert(sum == 9); // -4 + 10 + 3

sum[THREE] = -3;
assert(sum == 3); // -4 + 10 + -3 

Ключи известны во время компиляции (т.е. размер обьекта статический). Надо чтоб сумма была доступна быстро и размер сруктуры минимально возможный.

Может есть что-то такое в std или boost?

Самому написать не сложно, я даже знаю как. Просто велосипедить не хочется.

★★★★★

Последнее исправление: KennyMinigun (всего исправлений: 2)

Ответ на: комментарий от KennyMinigun

Надо чтоб сумма была доступна быстро

std::valarray теоретически подходит, но он динамический, что нежелательно

std::valarray::sum разве O(1)?

seiken ★★★★★
()

Чем тебя обычная мапа не устраивает?

#include <iostream>
#include <map>
#include <boost/range/numeric.hpp>
#include <boost/range/adaptor/map.hpp>

int main()
{
    enum class Keys { One, Two, Three };
    std::map<Keys, int> map;
    map[Keys::Two] = 10;
    map[Keys::Three] = 3;
    std::cout << boost::accumulate(map | boost::adaptors::map_values, 0) << std::endl; 
    map[Keys::One] = -4;
    std::cout << boost::accumulate(map | boost::adaptors::map_values, 0) << std::endl;
    map[Keys::Three] = -3;
    std::cout << boost::accumulate(map | boost::adaptors::map_values, 0) << std::endl;
}
fluorite ★★★★★
()

а я б навелосипедил - при ините все значения в ноль, при вставке нового или удалении (ансет) тупо вычесть из суммы текущее и прибавить новое, засетить новое.

deep-purple ★★★★★
()
Ответ на: комментарий от fluorite

Чем тебя обычная мапа не устраивает?

Приходится платить за то, что неиспользуешь.

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от seiken

std::valarray::sum разве O(1)?

Кстати да. Всмысле нет.

KennyMinigun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.