我有std::vector<t_Mont> v
,t_Mont
有{float val,int i和int j}
我想make_heap(v.begin(), v.end())
和pop_head(v.begin(), v.end())
,但我在控制台上遇到很多错误。我想这是因为我传递了t_mont
类型的向量。
我希望对make_heap
的变量val
的值v
。
编译我需要做些什么?我必须重载make_heap
和pop_head
?我是怎么做到的?
感谢。
我的代码:
std::vector<t_Mont> v;
for (int i = 0; i < nCellsHeight; i++) {
for (int j = 0; j < nCellsWidth; j++) {
t_Mont aux;
aux.i = i;
aux.j = j;
aux.val = cellValues[i][j];
v.push_back(aux);
}
}
std::make_heap(v.begin(), v.end());
while (v.begin() != v.end()) {
std::cout << "Best of v = " << v[0].val << std::endl;
std::pop_heap(v.begin(), v.end());
v.pop_back();
std::make_heap(v.begin(), v.end());
}
答案 0 :(得分:1)
t_Mont
必须与operator<
具有可比性才能实现,或者您必须使用其他形式的std::make_heap
并将迭代器旁边的比较函数传递给if {原因是,您不希望t_Mont
通常是可排序的。)
也就是说,你必须定义
bool operator<(t_Mont const &lhs, t_Mont &rhs) {
// return true if lhs is less than rhs, false otherwise.
}
以便获得总订单(即a < b
表示!(b < a)
,a < b
和b < c
表示a < c
和!(a < a)
) ,或
struct t_Mont_compare {
bool operator()(t_Mont const &lhs, t_Mont &rhs) const{
// return true if lhs is less than rhs, false otherwise.
}
}
具有相同的条件。
答案 1 :(得分:1)
make_heap
和相关函数会使用<
比较值。您需要为您的类型提供该运算符的重载:
bool operator<(t_Mont const & lhs, t_Mont const & rhs) {
return lhs.val < rhs.val;
}
或在调用函数时提供自定义比较器:
auto comp = [](t_Mont const & lhs, t_Mont const & rhs){return lhs.val < rhs.val;};
std::make_heap(v.begin(), v.end(), comp);
如果您坚持使用古老的pre-lambda编译器,请完整定义函数类型:
struct Comp {
bool operator()(t_Mont const & lhs, t_Mont const & rhs){return lhs.val < rhs.val;}
};
std::make_heap(v.begin(), v.end(), Comp());
答案 2 :(得分:0)
您必须定义一个函数对象,以便在两个t_Monts之间进行比较。 make_heap的声明如下:
template <class RandomAccessIterator, class Compare>
void make_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp );
或者只是创建一个这样的函数:
bool comp_tmonts(const t_Mont& a, const t_Mont& b)
{
/* Insert your comparison criteria for less than here.
Return a boolean value corresponding to whether a is less than b */
}
然后将其作为第三个参数传递给make_heap函数:
make_heap(v1.begin(), v1.end(), comp_tmonts);