通过权重 随机选择对象

写项目需要用到根据权重,随机取出一个对象。

在网上没查到比较好的方法。后来想到可以根据map容器,通过重载运算符。达到此效果,因无需全部遍历,效率不会太低。

#include <iostream>
#include <map>
#include <string>

// 范围 map 键值
template<typename _T>
class RangeKey
{
public:
	RangeKey() {
		m_begin = 0;
		m_end = 0;
	}

	RangeKey(const _T& target_num) {
 		m_begin = target_num;
 		m_end = 0;
 	}

	RangeKey(const _T& begin,const _T& end) {
		m_begin = begin;
		m_end = end;
	}
  
	bool operator <(const RangeKey& ths) const
	{
		if (m_begin < ths.m_begin) 
		{
			return m_end < ths.m_begin;
		}
		return false;
	}

	_T get_begin() const { return m_begin; }
	_T get_end() const { return m_begin; }

private:
	_T m_begin;
	_T m_end;
};



int main()
{
	std::map<RangeKey<int>, std::string>	range_selector;
	// 添加每个键值的范围
	range_selector[{0, 2}] = "{0, 2}";
	range_selector[{3, 6}] = "{3, 6}";
	range_selector[{7, 20}] = "{7, 20}";
	range_selector[{21, 300}] = "{21, 300}";

	int rand_num[] = { 4,10,200,400 };

	for (int i = 0; i < 4; ++i)
	{
		auto find_str = range_selector.find(rand_num[i]);
		std::cout << "find num:" << rand_num[i] << " target str:" <<((find_str != range_selector.end()) ? find_str->second.c_str() : "{null}") << std::endl;
	}

	return 0;
}

处理结果

find num:4 target str:{3, 6}
find num:10 target str:{7, 20}
find num:200 target str:{21, 300}
find num:400 target str:{null}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值