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
Очевидно, это псевдокод, и вам может потребоваться немного больше функциональности, но он показывает основную концепцию.