Prasoon уже предложил множество различных (и хороших) способов сделать это, ни один из которых не нужно повторять здесь.Однако я хотел бы предложить альтернативный подход к скорости.
Если вы собираетесь делать это совсем немного, вы можете рассмотреть возможность «подклассификации» вашего вектора так, чтобы сумма элементовподдерживается отдельно (не на самом деле вектор подкласса, что сомнительно из-за отсутствия виртуального деструктора - я говорю больше о классе, который содержит сумму и вектор внутри него, скорее, has-a
чем is-a
, и предоставляет вектороподобные методы).
Для пустого вектора сумма устанавливается равной нулю.При каждой вставке в вектор добавляйте вставляемый элемент в сумму.На каждом удалении вычтите это.По сути, что-либо , которое может изменить базовый вектор, перехватывается, чтобы обеспечить постоянство суммы.
Таким образом, у вас есть очень эффективный метод O (1) для "вычисления" суммыв любой момент времени (просто верните рассчитанную сумму).Вставка и удаление займет немного больше времени, так как вы откорректируете итоговое значение, и вы должны принять во внимание этот удар по производительности.
Векторы, в которых сумма требуется чаще, чем вектор, изменяются, те, которые могут извлечь пользу из этой схемы, поскольку стоимость расчета суммы амортизируется по всем доступам.Очевидно, что если вам нужна только сумма каждый час, а вектор меняется три тысячи раз в секунду, она не подойдет.
Что-то вроде этого будет достаточно:
class UberVector:
private Vector<int> vec;
private int sum;
public UberVector():
vec = new Vector<int>();
sum = 0;
public getSum():
return sum;
public add (int val):
rc = vec.add (val)
if rc == OK:
sum = sum + val
return rc
public delindex (int idx):
val = 0
if idx >= 0 and idx < vec.size:
val = vec[idx]
rc = vec.delindex (idx)
if rc == OK:
sum = sum - val
return rc
Очевидно,Это псевдокод, и вам может потребоваться немного больше функциональности, но он показывает основную концепцию.