将2d向量传递给函数

时间:2016-11-26 11:35:48

标签: c++ vector types

我有一个2d的整数向量:

std::vector<std::vector<int> > matrix;

我想在这个对象上调用一个函数。 功能是:

int coverTransactions(int k, const std::vector<std::vector<int> > matrix ) { //k nombre de clusters
    int compteur = 0;
    for(int t = 0; t != 11; t++) {
        compteur = 0;
        for(int i = 0; i != k; i++) {
            if(matrix[t][i] == 1)
                compteur++;
        }
        if(compteur != 1)
            return -1; //on retourne -1 si la transaction n'appartient pas à un et un seul cluster
    }
    return 0;//si tout se passe correctement, cad t appartient à un et un seul cluster on retourne 0
}

不要注意法语评论,只是解释返回值如何与我想要解决的问题相关联,但它不会影响对代码的理解......

出于某种原因,以这种方式调用函数:

std::cout << coverTransactions(3, &matrix) << std::endl;

我收到以下错误:

 coderror: cannot convert ‘std::vector<std::vector<int> >*’ to ‘int (*)[3]’ for argument ‘2’ to ‘int coverTransactions(int, int (*)[3])’

我不明白为什么,因为它们是同一类型...

3 个答案:

答案 0 :(得分:2)

这里发生的事情是pass by reference,它与pass by pointer不同,在pass by pointer中,您将变量的地址传递给函数(调用它时),函数的定义接受指针。在这里,您基本上将指向vector的指针作为参数传递,从而执行coverTransactions(3, &matrix)

pass by reference

,而根据你的函数的定义,这里发生coverTransactions(3, matrix) ,因此,只需传递函数中的向量:

pointer

上述两种方法之间的区别在于NULL可以是references,但NULL永远不会references,因此我们确信我们引用了有效变量。这就是为什么尽可能使用pointers是一个好习惯,并且只在必要时才使用SELECT DATE(tdate) AS day, SUM(CASE WHEN tview = 'view1' THEN 1 ELSE 0 END) AS totaView1, SUM(CASE WHEN tview = 'view2' THEN 1 ELSE 0 END) AS totaView2, SUM(CASE WHEN tview = 'view3' THEN 1 ELSE 0 END) AS totaView3, SUM(CASE WHEN tview = 'view1' OR tview = 'view2' THEN 1 ELSE 0 END) AS totaView1Or2, COUNT(*) AS totalOfViews FROM mytable GROUP BY DATE(tdate)

答案 1 :(得分:1)

您尝试将指针传递给matrix而不是引用。删除&

std::cout << coverTransactions(3, matrix) << std::endl;

答案 2 :(得分:1)

    int coverTransactions(int k, const std::vector<std::vector<int> > &matrix ) { //k nombre de clusters
    int compteur = 0;
    for(int t = 0; t != 11; t++) {
        compteur = 0;
        for(int i = 0; i != k; i++) {
            if(matrix[t][i] == 1)
                compteur++;
        }
        if(compteur != 1)
            return -1; //on retourne -1 si la transaction n'appartient pas à un et un seul cluster
    }
    return 0;//si tout se passe correctement, cad t appartient à un et un seul cluster on retourne 0
}

因此,在调用函数时:

std::cout << coverTransactions(3, matrix) << std::endl;

现在,该去了!