Какова временная сложность передачи вектора размера n другой функции путем передачи по значению и передачи по ссылке?

#c #pass-by-reference #pass-by-value

#c #передача по ссылке #передача по значению

Вопрос:

 void fun(vector<int>vec)
{
   some code
}
int main()
{
   int n = 5;
   vector<int>avec(n);
   fun(avec);
}
 

Какова временная сложность передачи вектора размера n другой функции путем передачи по значению и передачи по ссылке?
Какова временная сложность этого кода, передающего вектор только один раз?

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

1. Знаете ли вы разницу между передачей по значению и передачей по ссылке?

2. Каково ваше понимание этой сложности? Есть предположения?

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

Ответ №1:

Передача std::vector размера N функции по значению, очевидно, имеет линейную сложность O(n) , поскольку она включает копирование N объектов. Передача по ссылке имеет сложность O(1) , поскольку фактически функции передается только адрес объекта std::vector , независимо от его размера.

Стоит отметить, что ситуация отличается с возвратом a std::vector из функции, в этом случае возврат по значению имеет сложность O(1) , поскольку в этом случае компилятор либо использует copy elision , если это разрешено, либо конструктор перемещения. Оба O(1) имеют сложность.