2016-10-14 2 views
1

Я знаю, что когда вы передаете массив в качестве параметра, вы в основном передаете адрес массива с индексом 0. Тогда аппаратное обеспечение знает, что int обычно составляет 4 байта, поэтому он может легко получить доступ к другим элементам. Мой вопрос про вектор. Если у меня есть функцияПередача ссылки на вектор как параметр

void bla(std::vector<int> &arr) 
    { 
    } 

Затем он должен передать ссылку на вектор, но это происходит, как с массивами? Векторы реализованы с использованием массивов, поэтому мое предположение заключается в том, что когда я передаю ссылку, она просто передает адрес первого элемента. Правильно это или нет?

Кроме того, если я передам как вектор, что произойдет? Будет ли он создавать копию в стеке? Thanks

ответ

0

В общем:

  • void foo(Bar b) - пройти по значению, b копия или оригинал Bar.
  • void foo(Bar& b) - по ссылке, исправить Bar через b.
  • void foo(Bar* b) - проход по указателю, вы можете исправить оригинал Bar по b (при условии, что b не имеет значения null).
  • void foo(const Bar& b) - pass by const reference, b является оригиналом Bar, но вы не можете изменить его в пределах foo.
  • void foo(const Bar* b) - pass by pointer-to-const, b является указателем на оригинал Bar, но вы не можете изменить его в пределах foo.
  • void foo(Bar* const b) - проходите мимо константный указатель, b является указателем на оригинальный Bar и оригинальный Bar может быть изменен (пока b не равно нулю), но вы не можете изменить то, что b указывает.
  • void foo(const Bar* const b) - передать const pointer-to-const, вы не можете изменить оригинал Bar и не можете изменить то, что b указывает в пределах foo.
0

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

Источник: Школьное кодирование (пожалуйста, отредактируйте, если это неточно).

5

std::vector является очень отличается, чем сырой массив C-стиле, так что если вы передаете std::vector ссылочной никто не может сказать, что адрес первого элемента в std::vector является то, что передается в функцию.

Внутри std::vector есть больше логики, чем просто «необработанный массив C-стиля».

Если вы хотите, чтобы адрес первого элемента в векторе, вы можете получить его с помощью &v[0] или v.data().

Если вы передадите вектор по значению, вы получите копию исходного вектора. И все изменения, которые вы делаете с этой копией внутри вашей функции, - , а не, отражены в оригинале.

+0

Итак, когда я передаю вектор по ссылке, я передаю какой-то адрес, а затем оборудование может каким-то образом получить вектор, используя только один адрес, правильно? – Andrey

Смежные вопросы