如何通过引用传递矢量的静态矢量?

时间:2019-07-07 07:54:55

标签: c++ function c++11 pass-by-reference stdvector

我想传递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);
      ^

2 个答案:

答案 0 :(得分:1)

首先,您没有看起来像std::vector<std::vector<Type>> vector的矢量 。您拥有的是向量的 variable-length array

VLA不是C ++标准的一部分,而是它们的编译器扩展。有关更多信息,请参见此帖子: Why aren't variable-length arrays part of the C++ standard?

话虽如此,如果n是编译时已知的,则可以通过提供n作为非类型模板参数来解决该问题。

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

对于 vector的矢量,不需要模板,而是通过引用传递模板。

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

答案 1 :(得分:1)

您可以像这样传递向量

#include<bits/stdc++.h>
using namespace std;

// This function prints all element of vector
void FunctionWithVector(vector<int> &v) {
    for(auto x: v) {
        cout << x << "\n"
    }
}

int main() {
    vector<int> v(5);
    for(int i=0;i<5;i++) {
        v[i] = i;
    }
    FunctionWithVector(v);
}