Как передать статический вектор векторов по ссылке? - PullRequest
1 голос
/ 07 июля 2019

Я хочу передать v вектор так, чтобы он не копировался каждый раз, когда я вызываю функцию one(..).Но я не могу этого сделать.

Может ли кто-нибудь помочь мне выбраться из этого?

int n; // global variable
void one(vector <int >(&v)[n]) 
{
    v[0][0] = 1;
}

int main()
{
    cin >> n;//n=1
    vector <int > v[n];
    v[0].push_back(9);
    one(v);
    cout << v[0][0];
}

Сообщение об ошибке:

prog.cpp:5:32: error: variable or field ‘one’ declared void
  void one(vector <int > (&v)[n]){
                                ^
prog.cpp:5:27: error: ‘v’ was not declared in this scope
  void one(vector <int > (&v)[n]){
                           ^
prog.cpp: In function ‘int main()’:
prog.cpp:17:6: error: ‘one’ was not declared in this scope
 one(v);
      ^

1 Ответ

1 голос
/ 07 июля 2019

Прежде всего, у вас нет вектора векторов , который будет выглядеть как std::vector<std::vector<Type>>. У вас есть массив переменной длины векторов .

VLA не являются частью стандарта C ++, скорее они являются расширениями компилятора. Смотрите этот пост для получения дополнительной информации: Почему массивы переменной длины не являются частью стандарта C ++?

При этом, если бы n было известно во время компиляции, вы могли бы решить эту проблему, указав n в качестве параметра шаблона нетипичного типа.

template<std::size_t n>
void one(std::vector<int> (&v)[n])
{
    v[0][0]=1;
}

В случае вектора векторов шаблоны не нужны, лучше передайте его по ссылке.

void one(std::vector<std::vector<int>> &v)
//                               ^^^^^^^^^^
{
    v[0][0]=1;
}
...