将元组的向量转换/构造为堆

converting/constructing vector of tuples into heap

本文关键字:转换 元组 向量      更新时间:2023-10-16

-构造

我构造了一个元组向量CCD_ 1。为了简单起见,我们假设它是这样构造的。

vector<tuple<int,int,int>> x;
for (int ii=0; ii < 10; ii++){
for (int jj=0; jj < 10; jj++){
currpeak[0] = ii + rand() % 10;
currpeak[1] = jj + rand() % 10;
currpeak[2] = rand() % 100;
x.emplace_back(currpeak[0], currpeak[1], currpeak[2]);
}
}

现在,我想根据第三个元素获得n个最大的元组,并将它们附加到另一个变量vector<tuple<int,int,int>> y。假设n=10

-排序

目前我是这样做的:对它们进行反向排序,然后选择前n个元素。

// Sort them by 3rd element
bool sortbythird_desc(const tuple<int,int,int>& a, 
const tuple<int,int,int>& b){
return (get<2>(a) > get<2>(b)); 
}
sort(x.begin(), x.end(), sortbythird_desc);
// Extract the top 10 elements from x and put into y
vector<tuple<int,int,int>> y;
for(int jdx =0; jdx<10; jdx++){
int curr_peak0=get<0>(x[jdx]);
int curr_peak1=get<1>(x[jdx]);
int curr_peak2=get<2>(x[jdx]);
y.emplace_back(curr_peak0, curr_peak1, curr_peak2);
}

然而,由于排序原因,这是O(nlogn)操作。

-堆尝试失败

如果我可以将x转换为堆,甚至从一开始就将其构造为堆:O(n)操作。pop_heap:O(log n)次。总共只需要O(n + log n) = O(n)操作。但是以下失败

// Convert x to a heap
bool Comp(const tuple<int,int,int>& a){
return get<2>(a); 
}
make_heap(x.begin(), x.end(), Comp);

错误

Severity    Code    Description Project File    Line    Suppression State
Error   C2197   'bool (__cdecl *)(const std::tuple<int,int,int> &)': too many arguments for call    Shash   C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.24.28314includexutility    1481    

我如何修改我的代码以将x转换为堆,甚至首先构造1?

最简单的方法是用((运算符传递结构。例如

struct Comp { 
bool operator()(const tuple<int,int,int>& a, 
const tuple<int,int,int>& b){
return (get<2>(a) > get<2>(b)); 
}
};

并将其传递给vector<tuple<int,int,int>> x0