Передача вектора по ссылке
Используя обычные C-массивы, я бы сделал что-то вроде этого:
void do_something(int el, int **arr)
{
*arr[0] = el;
// do something else
}
Теперь я хочу заменить стандартный массив на вектор и получить здесь те же результаты:
void do_something(int el, std::vector<int> **arr)
{
*arr.push_front(el); // this is what the function above does
}
Но он отображает "выражение должно иметь тип класса". Как это сделать правильно?
Ответы
Ответ 1
Вы можете передать контейнер по ссылке, чтобы изменить его в функции. Другие ответы, которые были рассмотрены, заключаются в том, что std::vector
не имеет функции-члена push_front
. Вы можете использовать функцию члена insert()
для vector
для установки O (n):
void do_something(int el, std::vector<int> &arr){
arr.insert(arr.begin(), el);
}
Или используйте вместо std::deque
для амортизации O (1):
void do_something(int el, std::deque<int> &arr){
arr.push_front(el);
}
Ответ 2
Если вы определяете свою функцию для принятия аргумента std::vector<int>& arr
и целочисленного значения, вы можете использовать push_back
внутри этой функции:
void do_something(int el, std::vector<int>& arr)
{
arr.push_back(el);
//....
}
использование:
std::vector<int> arr;
do_something(1, arr);
Ответ 3
void do_something(int el, std::vector<int> **arr)
должен быть
void do_something(int el, std::vector<int>& arr)
{
arr.push_back(el);
}
Пропустить по ссылке было упрощено использование &
в С++.
Ответ 4
Вы можете передать вектор по ссылке следующим образом:
void do_something(int el, std::vector<int> &arr){
arr.push_back(el);
}
Однако обратите внимание, что эта функция всегда добавляет новый элемент в обратную сторону вектора, тогда как ваша функция массива фактически изменяет первый элемент (или инициализирует его значение).
Чтобы достичь точно такого же результата, вы должны написать:
void do_something(int el, std::vector<int> &arr){
if (arr.size() == 0) { // can't modify value of non-existent element
arr.push_back(el);
} else {
arr[0] = el;
}
}
Таким образом вы либо добавляете первый элемент (если вектор пуст), либо изменяете его значение (если первый элемент уже существует).
Ответ 5
Вам не нужно использовать ** arr, вы можете использовать:
void do_something(int el, std::vector<int> *arr){
arr->push_back(el);
}
или
void do_something(int el, std::vector<int> &arr){
arr.push_back(el);
}
** arr не имеет смысла, но если вы настаиваете на его использовании, сделайте это так:
void do_something(int el, std::vector<int> **arr){
(*arr)->push_back(el);
}
но опять же нет причин для этого...