Как передать вектор в параметр функции (мне нужны указатели?)
Когда мы передаем вектор в функцию, почему мы не можем сделать это как массив?
В этом примере все работает нормально. Но если я делаю это так, почему это не работает как массив?
Так же, как массив, почему это невозможно?
3 ответа
Это вполне возможно, но вы передаете элемент вектора, а не сам вектор:
Если вы хотите передать ссылку на элемент вектора, вы можете сделать это тоже, остерегайтесь, этот элемент уже должен существовать:
В данном конкретном случае вам не нужны указатели, лучше использовать только ссылки, как это уже упоминалось, поскольку разыменование не требуется:
В этом вызове функции
Выражение аргумента имеет тип int * , а параметр функции имеет тип std::vector<int> *
И нет неявного преобразования из одного типа в другой.
По сути, объект типа std :: vector уже является указателем, заключенным в класс. Таким образом, передавая объект типа std :: vector по ссылке, вы фактически одновременно передаете указатель на выделенный массив, на который внутренне указывает вектор.
Обратите внимание на то, что в первой программе, представленной в вашем вопросе, вы передаете векторное значение по значению.
Таким образом, функция не изменяет исходный объект, переданный функции. Если вы хотите изменить исходный объект, тогда параметр функции должен иметь ссылочный тип, как, например,
Нечто похожее на то, что вы имеете в виду, сделано для стандартного класса std::string в C ++ 17. Это класс std::string_view . Вы можете передать указатель на первый элемент объекта типа std :: string, как вы это делаете с массивами. Но также вам необходимо передать длину массива символов, на который указывает указатель.
Вот демонстрационная программа.
vect[0] называет int , а не std::vector<int> .
&vect[0] это int * , а не std::vector<int> * . Вы не можете вызвать функцию, ожидающую std::vector<int> * с int *
Передача вектора строк в функцию
Нужно из одной функции перенести vector<string> в другую функцию и работать там с ней.
Я смог провернуть такое с данными типа int , а вот со string не выходит.
P.S. Я знаю, что у меня в коде ошибка, хочу просто понять суть как передать содержимое вектора в функцию.
![]()
Лучше всего передавать по ссылке. Представьте, что получается при передаче по значению — копируется каждая строка, идет выделение кучи памяти (весьма медленная операция). И потом — что бы вы ни делали с этим вектором строк в функции — это на оригинале не отразится. Иногда это совсем не то, что надо. Так что я рекомендую
если вам нужно как-то менять этот вектор и строки, или
если arr , если менять не надо.
В Вашем конкретном случае — первый вызов вообще полностью теряет все введенное, второй возвращает тот же вектор — т.е. очередное копирование всего при возврате! (Я пока молчу, что std::cout << «Сумма: » << fun(arr); не скомпилируется за отсутствием оператора вывода для вектора строк). После этого у вас есть вектор, возвращенный функцией fun(arr) , и вектор arr , который не имеет к этому возвращенному вектору никакого отношения.
Словом, в этом вашем коде передача аргумента только как неконстантной ссылки.
Как передать двумерный вектор функции на C ++?
Если он передается, он передается по значению или по ссылке?

Поскольку ваше объявление функции:
указывает указатель, по существу он передается по ссылке. Однако в C ++ лучше избегать указателей и передавать ссылку напрямую:
Это похоже на обычный вызов функции, но он передается по ссылке, как указано в объявлении функции. Это избавит вас от ненужного разыменования указателей.
Почему бы не передать только двумерный вектор?
Ну, во-первых, вы это неправильно создаете.
Вы можете передавать по значению, по ссылке или по указателю (не рекомендуется). Если вы переходите к функции, которая не меняет содержимое, вы можете передать ее либо по значению, либо по константной ссылке. Я бы предпочел константную ссылку, некоторые люди думают, что «правильный» способ — передавать по значению.