通过引用传递一个向量数组作为C ++函数的参数?

时间:2017-02-13 19:56:52

标签: c++

我在函数isInside中传递向量数组时收到并出错。可能是什么原因?

    # define MOD 666013
    vector <node*> newGraph[MOD];

    node* isInside(vector<node*>& v[MOD], int label) {
        for (auto &x: v[label%MOD])
            if (x->label == label)
                return x;

        return NULL;
    }

    node* result = isInside(newGraph, x->label);

这是收到的错误: enter image description here

3 个答案:

答案 0 :(得分:2)

vector<node*>& v[MOD]

由于C ++规则,这不是对数组的引用,但是,正如错误告诉你的那样,引用数组是不允许的。

你需要这样做:

vector<node*> (&v) [MOD]
              ^  ^

如果您想了解此处发布的规则,请参阅C spiral rule

虽然这回答了你的问题,但请知道这是不好的风格。您正在将C方式(例如,定义)与现代C ++(例如范围)混合使用。也许发布在codereview上。

答案 1 :(得分:0)

通过引用或指针传递数组时,需要将参数名称包装在括号中,例如:

node* isInside(vector<node*> (&v)[MOD], int label)

但是,既然你明显使用C ++ 11,为什么不使用std::array呢?

const int MOD = 666013;
typedef std::vector<node*> nodeVec;
typedef std::array<nodeVec, MOD> graphArr;

graphArr newGraph;

node* isInside(graphArr &v, int label) {
    for (auto &x: v[label%MOD]) {
        if (x->label == label)
            return x;
    }
    return nullptr;
}

然后考虑使用std::find_if()而不是手动循环:

node* isInside(graphArr &v, int label) {
    auto &e = v[label%MOD];
    auto itr = std::find_if(e.begin(), e.end(), [label](node *n) { return n->label == label; });
    if (itr != e.end()) return *itr;
    return nullptr;
}

答案 2 :(得分:-2)

尽量不要声明v [MOD],而是使用简单的v,也许我错了。