我有一个std::vector<Server>
,我填充它,然后在我的程序的其余部分中永远不会改变。
我想在优先级队列中使用这些,但我需要身份语义;复制Server
对象会创建我无法正确使用的新对象。基本上:
Server
对象可由done
成员(类型double
,表示时间)排序,Server
实现operator <
和operator >
- 我将重复地将
Server
对象放入优先级队列并将它们取出 - 这允许我从优先级队列中取出一个具有最早
done
时间的队列 - 我从不将
Server
放入队列两次(如果有关系的话) Server
在优先级队列中时,done
时间永远不会更改,只有当Server
在队列外时才会更改- 我需要能够在将
Server
对象从队列中取出时直接访问它,而不是通过vector
我读到std::reference_wrapper
可以在std::vector
和其他容器中使用。但是当Server
对象在reference_wrapper
中时,我似乎无法让优先级队列识别它们的顺序关系。
有办法解决吗?下面是我的程序的相关部分:
class Server {
private:
... // other members
double done; // done time
public:
...
double next_free(void) const { return done; }
bool operator < (const Server& other) const {
return done < other.done;
}
bool operator > (const Server& other) const {
return done > other.done;
}
};
...
int main(int argc, char **argv) {
...
std::vector<Server> servers;
for (int i = 0; i < 10; ++i)
{
Server server(i,i,0.01);
servers.push_back(server);
}
typedef std::reference_wrapper<Server> ServerRef;
std::priority_queue<ServerRef, std::vector<ServerRef>, std::greater<ServerRef>> pq;
for (auto it = servers.begin(); it < servers.end(); ++it)
{
pq.push(std::ref(*it));
}
...
}
如果我注解掉包含pq.push
的for循环,那么我的程序编译,但否则我会从clang得到一堆错误,从以下开始:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional:742:21: error:
invalid operands to binary expression ('const std::__1::reference_wrapper<Server>' and 'const
std::__1::reference_wrapper<Server>')
{return __x > __y;}
~~~ ^ ~~~
2条答案
按热度按时间baubqpgj1#
std::reference_wrapper
没有为它定义比较运算符,所以你必须提供自己的比较运算符。你可以使用lambda表达式来实现:然后,您可以将其提供给
priority_queue
,如下所示:如果你不想使用lambda表达式,你可以写你自己的仿函数:
eoigrqb62#
我想我只需要为ServerRef定义
operator >
: