我有一个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])’
我不明白为什么,因为它们是同一类型...
答案 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;
现在,该去了!