2012-07-11 44 views
1

如何爲多圖中的特定鍵選擇一個隨機元素。例如:在Multimap中爲特定鍵選擇隨機元素

multimap<string, string> map; 
map.insert(pair<string, string>("Mammal", "Tiger")); 
map.insert(pair<string, string>("Mammal", "Chicken")); 
map.insert(pair<string, string>("Mammal", "Fox")); 
map.insert(pair<string, string>("Fish", "Clown Fish")); 
map.insert(pair<string, string>("Fish", "Ray")); 

在上面,什麼是最好的方法來得到一個隨機的「哺乳動物」?

我知道我可以得到迭代器的「哺乳動物」,所以:

pair<MultiMapIt,MultiMapIt>iterators = mMultiMap.equal_range("Mammal"); 
// loop through each... and select one. 

但我相信有一個更好的解決方案...也許使用迭代器作爲數字..
感謝

+0

添加一個隨機數(在返回範圍的開始和結束之間的距離)是不夠的? – Nim 2012-07-11 11:29:46

+0

不知道如何獲得'iterators.first'到一個'int'來做隨機... – Ross 2012-07-11 11:34:02

+0

計算兩個返回的迭代器之間的'std :: distance()'並使用一個RNG給你一個隨機數你可以'std :: advance()'迭代器('iterators.first') - 給你一個隨機的哺乳動物。 – Nim 2012-07-11 11:37:31

回答

5

插入註釋的答案:

  1. 獲取迭代器區間 - 你有這個已經
  2. 計算範圍的大小

    std::size_t sz = std::distance(iterators.first, iterators.second);

  3. 立即生成一個隨機指數:

    std::size_t idx = std::rand() % sz; // stupid example

  4. 移動迭代到該位置

    std::advance(iterators.first, sz);

現在iterators.first指向一個隨機哺乳動物。

+1

+1雖然值得注意的是,由於映射迭代器通常不是隨機訪問迭代器,所以這種方法在範圍的大小上具有線性複雜性(即使這在大多數情況下可忽略不計,因爲很少有多重映射數千或更多的副本)。 – 2012-07-11 13:21:38