我正在尝试用C ++实现mergesort树,但是我收到了错误
note: template argument deduction/substitution failed:
C:\Users\IT Services\Documents\mergetree.cpp:15:38: note: candidate expects 6 arguments, 2 provided
tree[k]=merge(tree[2*k],tree[2*k+1]);
这是代码:
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> tree;
int n;
void update (int k, vector<int> vect)
{
k+=n;
tree[k]=vect;
for (k/=2;k>=1;k/=2)
{
tree[k]=merge(tree[2*k],tree[2*k+1]);
}
}
vector<int> merge (vector<int> arr1, vector<int> arr2)
{
int a1=arr1.size(), a2=arr2.size();
vector<int> sortvect(a1+a2);
int i=0,j=0,k=0;
while (i<a1&&i<a2) sortvect[k++]=((arr1[i]<arr2[j])?arr1[i++]:arr2[j++]);
while (i<a1) sortvect[k++]=arr1[i++];
while (j<a2) sortvect[k++]=arr2[j++];
return sortvect;
}
int main()
{
cin>>n; tree.resize(2*n,{0});
int a;
for (int i=0;i<n;i++)
{
cin>>a;
update(i,{a});
}
}
显然,合并函数不需要6个参数。为什么编译器认为它呢?
[另外,请忽略编写代码的可怕方式。我正在为即将到来的比赛练习,目前还没有优先考虑清晰的编码惯例。
标准算法库中有一个std :: merge API(http://en.cppreference.com/w/cpp/algorithm/merge)。它的味道有6个参数。第15行的合并调用可能是其中一个函数的giong。
您可以通过检查错误描述后列出的候选项来确保这一点。
您应该在计划使用它的行之前转发声明您的合并方法。而不是using namespace std;
,明确地解决范围,你想要使用std方法。在第15行,将merge调用为:: merge。如果您只是希望您的合并具有文件范围,则将其放在未命名的命名空间中。