2017-02-13 95 views
-2

我接收并在函数isInside中传递向量数组时发生错误。原因是什么?通过引用传递一组向量作为C++中函数的参数?

# 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

您通常不创建的std ::矢量<>''的一个C语言风格的阵列;你可能想阅读[documentation](http://en.cppreference.com/w/cpp/container/vector)。 –

+0

为什么你有一个指针向量(shared_ptr也许)。然后是传统阵列。 –

+0

我用这种方式实现一个hashmap。关键是矢量 –

回答

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
vector<node*>& v[MOD] 

由于C++规则,这不是对数组的引用,但是,作为误差告诉你,引用数组,这是不允许。

你需要做的:

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

如果你想知道,去这里的规则,阅读有关C spiral rule

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

-2

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

+1

阵列中的索引,你是错的。 – bolov