2011-12-19 2 views
0

Я один вопрос в виду, что если у меня есть вектор STL, я могу написать какстанд :: вектор указатель

std::vector<int> *p; 

Но я не могу решить, если я буду использовать его в любой ситуации? Также что произойдет с указателем p в этом случае, если я изменю размер вектора, который является указателем на p?

Я могу назвать глупым здесь, но эти вопросы только что пришли к сведению, и я могу скомпилировать вещь std::vector<int> *p в g ++.

+2

Я считаю, что вы путаете указатель на вектор указателю на элементы вектора. Это вполне понятно, так как способ C и C++ обрабатывать встроенные массивы поощряет эту путаницу. Но указатель на вектор не имеет ничего общего с его элементами, в отличие от указателя на массив. – Omnifarious

ответ

3

Говоря:

std::vector *p; 

Вы объявляете указатель на вектор. Теперь вам нужно назначить ячейку памяти для хранения содержимого содержимого Vector Object, а не отдельных элементов. После этого вы можете добавлять, удалять, удалять и обновлять отдельные элементы в соответствии с вашим желанием.

Что касается изменения размера вектора, то ничего не произойдет с памятью р имеет в виду, только содержание этой памяти, связанной с объектом Вектор изменится.

Одно из применений такой структуры, чтобы иметь динамический массив векторов. Допустим, вы не должны поддерживать список смежности узлов, но вы не уверены заранее о том, как много узлов придумают, до времени выполнения.

+1

Я бы сказал, что вместо того, чтобы динамический массив векторов можно просто использовать вектор векторов. Нет почти никакой причины (фактически, я не могу думать об этом) объявить вектор таким образом в современном C++ (думаю, умные указатели). –

+0

@Shamim, поэтому я полагаю, что в случае изменения размера вектора, мой указатель р оставаться действительным (даже внутренняя ячейка памяти будет изменена для вектора во время операции изменения размера)? – Ruchi

+0

@Ruchi: Да, указатель будет по-прежнему действителен. –

0

Вы можете использовать указатели на вектор в случае, если вы хотите, чтобы выбрать один конкретный вектор из многих во время выполнения, т.е.. е. вы хотите выбрать его динамически.

Что касается вопроса «изменить размер»: как указано Are vector pointers affected by resize()?, указатель на сам вектор действителен, как только вектор существует. Но указатели на элементы вектора могут измениться. Например:

std::vector<int> v; 
std::vector<int> *p; 
p = &v; // Does not change 

int *pe; 
pe = &v[0]; // May change 
Смежные вопросы