set不能通过指针元素指向的成员进行排序

本文介绍如何在C++中使用自定义类与标准模板库set进行元素排序,特别是针对指针对象的排序方法。通过两个具体示例,详细展示了如何实现自定义比较操作符以满足特定的排序需求。

 

class ChildClient
{
public:
int iCurCount;
int iMaxCount;
ChildClient(int iMax, int iCur)
{
iMaxCount = iMax;
iCurCount = iCur;
}
bool operator<(const ChildClient* pClient) const
{
return (iMaxCount - iCurCount) < (pClient->iMaxCount - pClient->iCurCount);
}
};
set中不能通过存储的指针所指向的内容进行排序,如std::set<ChildClient*>这个就不能排序, 而存储的对象的成员可以用来排序,如std::multiset<KChild>;
如果实在需要一个指针也存入set, 则可以构造一个类,包含一个比较参数和需要存储的指针, 如
class WaitingRoomNode
{
public:
     int m_iWaitCount;
CGameRoom* m_pGameRoom;
WaitingRoomNode(int iCount, CGameRoom* pGameRoom)
{
m_iWaitCount = iCount;
m_pGameRoom = pGameRoom;
}
bool operator<(const WaitingRoomNode objNode) const
{
return objNode.m_iWaitCount > m_iWaitCount;
}
};
上面是为一个等待房间排序写的类,运行情况良好

 

### Unordered Set 数据结构概述 `unordered_set` 是 C++ STL 提供的一种关联容器,属于哈希表(Hash Table)家族的一部分[^2]。它的主要特点是 **不保持元素的有序性**,而是通过哈希函数将元素映射到不同的桶中存储。这种设计使得 `unordered_set` 能够提供平均时间复杂度为 O(1) 的插入、删除和查找操作。 #### 底层实现原理 `unordered_set` 的底层基于哈希表实现,具体来说采用的是 **开链法(Separate Chaining)** 来解决哈希冲突问题[^5]。这意味着当多个键被映射到同一个桶时,这些键会以链表的形式存储在同一桶中。每个桶实际上是一个指向链表头节点的指针。 以下是关于 `unordered_set` 的一些重要特性: - **唯一性约束**:`unordered_set` 中不允许存在重复的元素。 - **无序性**:由于依赖于哈希函数而非比较运算符来定位元素,因此其中的元素不会按任何特定顺序排列。 - **动态调整大小**:随着元素数量的增长,如果负载因子超过一定阈值(通常是 1.0),则会触发重新分配桶的数量并重新分布现有元素的过程称为 rehashing。 #### 使用示例 下面展示如何定义以及基本操作一个简单的 `unordered_set` 实例: ```cpp #include <iostream> #include <unordered_set> using namespace std; int main(){ unordered_set<int> uset; // 插入元素 uset.insert(4); uset.insert(7); uset.insert(9); // 遍历集合中的所有元素 for(auto elem : uset){ cout << elem << ' '; } cout << endl; // 查找某个指定数值是否存在 if (uset.find(7)!=uset.end()){ cout<<"Element found!"<<endl; } return 0; } ``` 此程序创建了一个整型的 `unordered_set` 并执行了一些基础的操作如插入新成员与检测某项是否已存在于该集中。 #### 和其他集合类别的对比 相对于传统的 `set` 容器而言,虽然两者都支持快速检索功能,但由于前者采用了红黑树作为内部机制从而维持了严格的排序关系;而后者则是利用散列表技术放弃了这一属性换取更高的效率表现,在实际应用当中可以根据需求选择合适的类型[^4]。 另外值得注意的一点是尽管大多数情况下我们可以认为上述提到的各种方法的时间消耗接近常量级别即O(1),但实际上这取决于具体的输入数据集及其引发的相关行为比如碰撞频率等因素的影响可能会导致最坏情况下的性能退化至线性增长趋势即O(n)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值