Подтвердить что ты не робот

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

Используя обычные 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
}

Но он отображает "выражение должно иметь тип класса". Как это сделать правильно?

4b9b3361

Ответ 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);
}

но опять же нет причин для этого...