写项目需要用到根据权重,随机取出一个对象。
在网上没查到比较好的方法。后来想到可以根据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}