我有一个由汽车品牌ID和相关汽车模型组成的列表,例如:
1卡罗拉
1 Yaris
1矩阵
2切诺基
2自由
3 CR-V
3 CR-Z
3个元素
3思域
3飞行员
其中1 =丰田,2 =吉普,3 =本田。请注意,每个汽车品牌的车型基数不同。
我想为每个汽车品牌检索随机车型。每个汽车品牌要检索的汽车数量取决于相关模型的总数和输入浮动参数:'nPercentage'。 ('nPercentage'参数对于所有不同的汽车品牌都是相同的)。例如,如果nPercentage = 0.5,则可能的随机输出为:
1卡罗拉
1矩阵
2自由
3 CR-Z
3思域
3飞行员
我目前正在使用multimap类,因为密钥可以复制。到目前为止,我能够找到非重复的密钥并计算相关元素的数量。 任何人都可以了解如何检索每个汽车品牌的随机车型? 下面是我到目前为止的代码。
//The variable 'm_mapDatasetMapping' is of type: multimap<int, string>
multimap< int, string >::size_type countPerKey;
const int *pLastKey = NULL;
multimap<int,string>::const_iterator it=m_mapDatasetMapping.begin();
// looking for non-duplicated keys.
for( ; it!=m_mapDatasetMapping.end(); it++){
if( (pLastKey!=NULL) && (*pLastKey==it->first) ){
continue;
}
pLastKey = &(it->first);
// count the number of values associated to the given key.
countPerKey = m_mapDatasetMapping.count(*pLastKey);
/* Select 'x' random elements associated with the key '*pLastKey'.
The number of random elements to be extracted
is a percentage of the total number of values per key, i.e.:
x = nPercentage * countPerKey
*/
...
}
答案 0 :(得分:0)
最简单的方法可能是将给定密钥的所有值复制到一个新容器中,例如vector
,random_shuffle
和resize()
来减少它它的大小为x:
int x = nPercentage * countPerKey;
auto range = m_mapDatasetMapping.equal_range(*pLastKey);
std::vector<std::string> values;
for(auto i = range.first; i != range.second; ++i)
values.push_back(i->second);
std::random_shuffle(values.begin(), values.end());
values.resize(x);