Prasoon вже запропонував безліч різних (і хороших) способів зробити це, жоден з яких тут не потрібно повторювати. Однак я хотів би запропонувати альтернативний підхід для швидкості.
Якщо ви збираєтеся робити це зовсім небагато, ви можете розглянути «підкласифікацію» вашого вектора, щоб сума елементів підтримувалась окремо (а не насправді вектор підкласифікації, який є iffy через відсутність віртуальний деструктор - я кажу більше про клас, який містить суму і вектор всередині нього, 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
Очевидно, що це псевдо-код, і, можливо, ви хочете мати трохи більше функціональності, але він показує основну концепцію.