Я кодирую на C ++. Если у меня есть какая-то функция void foo(vector<int> test)
и я вызываю ее в своей программе, будет ли вектор передан по значению или ссылке? Я не уверен, потому что знаю, что векторы и массивы похожи, и что функция вроде void bar(int test[])
бы проходит тест по ссылке (указатель?), А не по значению. Я предполагаю, что мне нужно было бы явно передать вектор по указателю / ссылке, если бы я хотел избежать передачи по значению, но я не уверен.
97
Ответы:
Если бы мне пришлось угадывать, я бы сказал, что вы из Java. Это C ++, и все передается по значению, если вы не укажете иное с помощью
&
оператора -оператора (обратите внимание, что этот оператор также используется как оператор адресации, но в другом контексте). Все это хорошо задокументировано, но я все равно повторю:void foo(vector<int> bar); // by value void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo) void foo(vector<int> const &bar); // by const-reference
Вы также можете передать указатель на vector (
void foo(vector<int> *bar)
), но если вы не знаете, что делаете, и не чувствуете, что это действительно правильный путь, не делайте этого.Кроме того, векторы - это не то же самое, что массивы! Внутренне вектор отслеживает массив, управление памятью которого он обрабатывает за вас, как и многие другие контейнеры STL. Вы не можете передать вектор функции, ожидающей указатель или массив, или наоборот (вы можете получить доступ к (указателю) базового массива и использовать его). Векторы - это классы, предлагающие множество функциональных возможностей через свои функции-члены, тогда как указатели и массивы являются встроенными типами. Кроме того, векторы распределяются динамически (что означает, что размер может определяться и изменяться во время выполнения), тогда как массивы в стиле C выделяются статически (его размер постоянен и должен быть известен во время компиляции), что ограничивает их использование.
Я предлагаю вам прочитать еще о C ++ в целом (особенно о распаде массива ), а затем взглянуть на следующую программу, которая иллюстрирует разницу между массивами и указателями:
void foo1(int *arr) { cout << sizeof(arr) << '\n'; } void foo2(int arr[]) { cout << sizeof(arr) << '\n'; } void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; } void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; } int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; foo1(arr); foo2(arr); foo3(arr); foo4(arr); }
источник
vector
Функционально A аналогичен массиву. Но для языкаvector
это тип, аint
также тип. Для аргумента функции массив любого типа (включаяvector[]
) рассматривается как указатель. Avector<int>
- это не то же самое, чтоint[]
(для компилятора).vector<int>
не является массивом, не ссылкой и не указателем - он передается по значению и, следовательно, вызывает конструктор копирования.Итак, вы должны использовать
vector<int>&
(желательно сconst
, если функция не изменяет его), чтобы передать его в качестве ссылки.источник
void foo(vector<int> test)
вектор будет передан по значению в этом.
У вас есть больше способов передачи векторов в зависимости от контекста: -
1) Передача по ссылке: - Это позволит функции foo изменить содержимое вектора. Более эффективен, чем передача по значению, поскольку предотвращается копирование вектора.
2) Передача по константной ссылке: - Это эффективно и надежно, если вы не хотите, чтобы функция изменяла содержимое вектора.
источник
когда мы передаем вектор по значению в функцию в качестве аргумента, он просто создает копию вектора, и никакого эффекта не происходит с вектором, который определен в основной функции, когда мы вызываем эту конкретную функцию. тогда как когда мы передаем вектор по ссылке все, что написано в этой конкретной функции, каждое действие будет выполняться с вектором, который определен в основной или другой функции, когда мы вызываем эту конкретную функцию.
источник