Передача ссылки на вектор в качестве параметра

#c #vector #parameter-passing #pass-by-reference

#c #вектор #передача параметров #передача по ссылке

Вопрос:

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

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

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

Кроме того, если я передам просто как вектор, что произойдет? Создаст ли это копию в стеке? Спасибо

Ответ №1:

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

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

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

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

Комментарии:

1. Хорошо, поэтому, когда я передаю вектор по ссылке, я передаю некоторый адрес, а затем аппаратное обеспечение может каким-то образом получить вектор, используя только один адрес, правильно?

Ответ №2:

В общем:

  • void foo(Bar b) — передача по значению, b является копией или оригиналом Bar .
  • void foo(Baramp; b) — передача по ссылке, вы можете изменить оригинал Bar через b .
  • void foo(Bar* b) — передача по указателю, вы можете изменять оригинал Bar через b (до тех пор, пока b не равно null).
  • void foo(const Baramp; b) — передача по ссылке const, b является исходной Bar , но вы не можете изменить ее в области видимости foo .
  • void foo(const Bar* b) — передача по указателю на const, b является указателем на оригинал Bar , но вы не можете изменить его в области видимости foo .
  • void foo(Bar* const b) — передача по указателю const , b является указателем на оригинал Bar , и оригинал Bar может быть изменен (если b он не равен null), но вы не можете изменить, на что b указывает.
  • void foo(const Bar* const b) — передача по указателю const на const, вы не можете изменить оригинал Bar и не можете изменить то, что b указывает на область видимости foo .

Ответ №3:

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

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