map 和 set 一起使用的场景其实也蛮多的,最近业务上就遇到了。需求是这样的,一条路径(mpls中的lsp)会申请多个 id,这个 id 是独一无二的。这里很显然就就一个”一对多“的情况,合适用这个容器不保存这些信息,如:std::map> mLdpIdmMap; 下面为一个完成的可编译运行的代码,只是功能并不完善。
#include
#include
这里主要借这个说明一下 set,set 里的元素是唯一的,且是有序的,它和 map 的底层实现同样的红黑树,所以如果 set 的元素类型是自定义类型的,则必须要实现 operator< 否则是无法编译的。如:
![map 和 set 的一起使用_第1张图片](http://img.e-com-net.com/image/info8/b857e65c739d40e49faf1f0b5117b809.jpg)
因为 set 的元素是有序的,所以每次插入元素都要进行比较。那实现 operator> 是否可行 ,反正都是比较,其实是不行的,因为它底层实现就是用的 小于号 < ,如错误所示。
使用 auto 进行插入及读取数据的代码:
int idm_bundle_manager::getLdpById(uint32_t idmId)
{
std::lock_guard guard(mtx);
for(auto ite : mLdpIdmMap)
{
if(idmId >= ite.second.begin()->baseId && idmId <= ite.second.end()->endId)
{
return ite.first;
}
}
return 0;
}
bool idm_bundle_manager::insertLdpIdm(uint32_t ldpIdx, uint32_t baseId, uint32_t num)
{
bundle_set set{baseId, baseId + num -1};
auto ret = mLdpIdmMap[ldpIdx].insert(set);
return ret.second;
}