std::set<VALUE, std::owner_less<VALUE>>的目的是什么?

6

我正在分析这个websocket++示例 https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

第126行有typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;。我想知道为什么不直接使用typedef std::set<connection_hdl> con_list;

我已经阅读了逗号运算符如何工作http://en.cppreference.com/w/cpp/memory/owner_less,但我不确定其目的。

std::set中实际存储的是什么?std::owner_less实际上是做什么的?用这种结构创建容器的目的是什么,而不是直接存储连接句柄connection_hdl本身?


2
这与逗号运算符无关,而您链接到的有关std::owner_less的页面应直接回答您的问题。 - ildjarn
1
std::set 接受多个模板参数,但只有第一个是明确需要的;如果您不定义它们,则其余参数具有默认类型。第二个参数是用于排序的二元函数。 - Collin Dauphinee
2
顺便提一下,connection_hdl 是一个 std::weak_ptr<void> - Jesse Good
1
@Joe:如果你阅读了你链接的页面,你就会知道std::weak_ptr<>没有operator<,所以它没有一个特殊的比较器就不能编译。;-] - ildjarn
@ildjarn 哦哦哦哦哦,好的。我是C++的新手,所以需要一段时间才能理解哈哈。你让它更清晰了。谢谢! - user1382306
1个回答

8
这与逗号运算符无关。一个`set`要求`T`是可比较的,即需要为`T`定义运算符`<`。这是因为`set`以一种有序方式保留其元素(通过某种类型的树)。您可以使用第二个模板参数来为`set`提供比较两个元素的函数对象。 `std::owner_less` 是一个谓词模板,作用于共享和弱指针,并执行基于所有权(而不是基于值)的排序。std::owner_less

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接