2011-03-23 60 views
0

我有包括車名單分組元素的隨機子集品牌標識的和相關的車型,如:從multimap中通過按鍵

1花冠
1威姿
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先導

I」 m目前正在使用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

也許遵循最簡單的方法是拷出所有的值給定鍵到一個新的容器,比如一個vectorrandom_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); 
+0

謝謝!它像一個魅力!我只需要改變變量'range'的'type',即從'auto'變爲'pair :: iterator,multimap :: iterator>',並且變量'i'的類型也從' auto'到'multimap :: iterator'。 – Javier 2011-03-23 14:14:18

+0

@Javier for non-selected,你是不是指如何使用'values [x]'中的值初始化一個新的向量到values.end()? 'vector other_values(values.begin()+ x,values.end());',在'values.resize(x)'之前。是的,'auto'類型可以節省大量現代編譯器的編寫工作! – Cubbi 2011-03-23 14:14:53

+0

是的!這是我做到的。 – Javier 2011-03-23 14:16:53