Dynamiczne tablice i vector - dwa pytania o rozmiar

0

Witam,
Mam dwa pytania dot. wielkości dynamicznej tablicy i vectora.

Pierwsze pytanie dot. tablicy dynamicznych tj. np. czegoś w stylu:

int* tablica_dynamiczna = new int[100];

.
Moje pytanie brzmi: czy jeśli chcę skrócić taką tablicę o połowę tj. do 50 elementów to czy mogę zrobić coś w stylu:

int* remove_from = &tablica_dynamiczna[50];
delete remove_from;

a dalej operować na indeksach od 0 do 49 tej starej tablicy a później skasować tą starą tablicę tj. delete tablica_dynamiczna;?
Czy może muszę utworzyć nową tablicę 50 elementową -> przekopiować interesujące mnie wartości i skasować starą?

Pytanie uzupełniające do tego to czy usuwając ostatnie elementy z vectora typu: vec.erase(vec.begin() + 50, vec.end()); zostanie utworzona nowa tablica i przekopiowane wszystkie wcześniejsze elementy, czy jakoś może inaczej się to wykona?

Drugie pytanie dot. vectora - co oznacza metoda reserve? A raczej co ona dokładnie robi?
Czy jeśli zrobię coś w stylu:

vector<int> vec;
vec.reserve(10);

To zostanie już utworzona tablica o rozmiarze 10 elementów? Nie chodzi mi o możliwość odwoływania się do poszczególnych elementów, tylko czy metoda reserve robi coś konkretnego?

Problem dot. takiej sytuacji, że znam maksymalną wielkość tablicy, ale na pewno będzie ona dużo mniejsza.

Z góry dziękuję za pomoc.

2

Nie możesz tak zrobić. Dla agregatów możesz użyć funkcji rodem z C: realloc (wraz z malloc i free). http://en.cppreference.com/w/cpp/memory/c/realloc

Znacznie wygodniej i bezpieczniej jest jednak użyć std::vector.

std::vector::reserve powoduje alokację (doprowadza do takiego stanu, że capacity() ≥ od żądanej wartości), ale nie zmienia wielkości wektora. Dzięki temu gwarantuje szybkie wykonanie i brak realokacji push_back().

0

@kq dzięki za odpowiedź! Czyli jest tak jak podejrzewałem ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1