我在函数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);
答案 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,也许我错了。