我有这两个功能
int FEL::enqueue(Event& new_event){
getting a reference of an event and add it to an Event array, defined as "Event *event_list"
}
Event FEL::dequeue(){
Event old_root = event_list[0];
event_list[0] = event_list[--event_index];
resort_heap(0);
return old_root;
}
它工作得很好,但我想修改它以便在出列函数中获得更好的性能。 由于dequeue函数返回Event,我认为如果我只返回事件的引用而不是整个事件结构可能会更好。
如何更改出队函数的返回类型以返回事件的引用? 我想我可以做这样的事情来返回指针,但是如何返回事件的引用(&)?
Event* FEL::dequeue(){
Event *old_root = &event_list[0];
event_list[0] = event_list[--event_index];
resort_heap(0);
return old_root;
}
答案 0 :(得分:0)
返回指针将不起作用,因为您正在修改event_list[0]
并且old_root
是指向该对象的指针,因此它将指向新值而不是旧值。至于返回引用,你也不能,因为返回的值必须是类的成员(或类的成员的元素,依此类推),如果你这样做,你将得到新的值,不是旧的。
如果要返回旧值,唯一的解决方案是按值返回。不过,它可能没有您想象的那么糟糕。大多数编译器都可以应用返回值优化,这意味着不会复制该对象。此外,如果对象包含任何已分配的存储,它可以从C ++ 11上的移动语义中受益。
修改:抱歉,当然还有其他方法可以做到这一点。
void FEL::dequeue(Event *old){
*old = event_list[0];
event_list[0] = event_list[--event_index];
resort_heap(0);
}
请注意,由于上述优化,这可能是一个过早的优化错误。