2010-02-16 48 views
0

只是作爲標題。至少我知道數組可能不是我想要的。在我想從數組中隨機選取一個項目之前,我需要生成一個隨機索引。爲了您的意見。哪個stl容器我應該選擇如果我需要隨機從容器中獲取一個物品

我已經將我的問題的標題更改爲「我應該選擇哪個stl容器如果我需要從容器中隨機獲取項目」。我真正發現的是一個cotain,假設我們說 C,並且這個Contain應該有方法,比方說,get_ramdom_member(),它將幫助我從Container C中隨機獲取一個項目,而不提供任何密鑰。

@binary: 我在容器中存儲的實際上是套接字fd。套接字的另一端是一個「erlang節點」。幾個erlang節點可以作爲一個集羣。因此,我將所有插座 fds存儲到一個容器中。每次我需要與羣集交談時,我需要選擇一個fd。爲了分擔負載,我需要隨機獲得一個。我無法告訴你們這個集裝箱需要維護的fd的數量,但目前它還不到10個。但誰知道這個數字是否會在一天之後變成1000。

+1

你能給我們提供更多關於你想要達到的目標的信息嗎?例如多少件物品,以及爲什麼隨機挑一件物品?對於您提供給我們的大量數據,我們很難給出任何建議。謝謝。 – 2010-02-16 11:59:11

+0

取決於你的解釋,向量就足夠了! – 2010-02-16 12:20:14

+0

隨機分配負載分配可能不是一個好主意。 – 2010-02-16 12:50:10

回答

5

從您提供的信息來看,這並不多,明顯的答案是std::vector。這會讓你隨機訪問元素。關於標準容器的好處是你可以用很少的努力在它們之間切換,所以如果向量不能平移,你可能會改變到另一個容器而不重寫所有的代碼。

如果您只是想隨機化容器的內容,請參閱std::random_shuffle

1

我們真的需要更多信息,但看起來您只需要一個std::vector。 這是索引隨機訪問的好選擇。

-1

你總是可以將一個數組包裝在一個類中,該類檢查賦值的邊界並增長以透明地容納新元素。雖然,你提到想要在數組中選擇一個隨機索引 - 這裏假設你已經在數組中填充了一些東西,那時你不再談論訪問不存在的索引,並且std::vector可以正常工作。

爲了適應您所有的需求,您總是可以使用std::map<int,Thing>。它允許您執行find查找元素,並且[]運算符按照您想要的方式使用存在的項目的數組。

+0

「你總是可以將一個數組封裝在一個檢查賦值邊界的類中」 - 你的意思是像std :: vector在()中使用的那樣? – 2010-02-16 12:03:08

+0

沒錯,但在大多數情況下'拋出'std :: out_of_range''的實例的默認行爲可能是不夠的。我更新了更具體的 – ezpz 2010-02-16 12:26:07

0

如果你想要一個隨機元素,並使自己容易。加載一個std::queue致電std::random_shuffle,然後彈出元素,直到你的心中的內容。

+0

你不能在std ::隊列上使用random_shuffle – 2010-02-16 13:10:09

+0

不是嗎?好吧,做一個'std :: deque'(因爲這是一個隊列的基礎),並彈出你的心內容的元素。 – 2010-02-16 13:25:13

相關問題