Controlul asupra std :: realocarea vectorului

Citind referința std :: vector am înțeles asta

    apelați inserați atunci când capacitatea maximă este atinsă va cauza realocarea std :: vector (cauzând invalidarea iteratorului) cu o capacitate mai mare. Scopul este de a păstra garanția despre date contigue.

  1. Atâta timp cât rămân sub capacitatea maximă inserați nu va cauza că (și iteratorii vor fi intacte).

Întrebarea mea este următoarea:

Atunci când reserve este apelat automat de insert , există vreo modalitate de a controla cantitatea de memorie nouă rezervată?

Să presupunem că am un vector cu o capacitate inițială de 100 și, atunci când capacitatea maximă este lovită, vreau să aloc un extra 20 de octeți.

Este posibil să faceți asta?

0

1 răspunsuri

Puteți să-l urmăriți întotdeauna și să rezervați rezerve înainte de al aloca, de ex.

static const int N = 20//Amount to grow by
if (vec.capacity() == vec.size()) {
  vec.reserve(vec.size() + N);
}
vec.insert(...);

Puteți înfășura această funcție într-o funcție proprie și apelați această funcție în loc să-i sunați direct pe insert() .

0
adăugat
Nu văd cum este sensibil. Apelul la reserve() va realoca toate elementele și apoi veți obține un alt set de copii atunci când apelați insert() . În plus, reserve() este garantat să rezerve cel puțin dimensiunea solicitată și poate de fapt să rezerve mai mult.
adăugat autor jrok, sursa
Punctul meu este, de ce să nu lăsăm insert() să facă treaba?
adăugat autor jrok, sursa
Întrebarea a fost cum pot să o controlez. Acesta este cel mai mult control pe care îl puteți obține și chiar dacă alocă mai mult, niciodată nu obțineți alocări care nu sunt prinse de această declarație, chiar dacă ele pot fi mai mari decât ați cerut.
adăugat autor Flexo, sursa
În acest caz, sunt de acord - ceea ce câștigi de la acest lucru nu pare să merite forța. Modificați modificările atunci când nu sunt pe mobil.
adăugat autor Flexo, sursa