gpt4 book ai didi

c++ - 将元组的 vector 转换/构造为堆

转载 作者:行者123 更新时间:2023-12-02 10:13:10 26 4
gpt4 key购买 nike

-施工
我构造了一个元组vector<tuple<int,int,int>> x的 vector 。为了简单起见,让我们假设它是以这种方式构造的。

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]);
}
}
现在,我想根据第3个元素获取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 Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\xutility 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));
}
};
并将其传递给 make_heap

关于c++ - 将元组的 vector 转换/构造为堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62754378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com