2013-02-28 23 views
0

我有以下情形:對許多離散值進行測試的首選方法是?

variable in {12, 4, 999, ... }: 

如果有列表中的約100個離散值。我正在編寫一個解析器將其轉換爲C++,我能想到的唯一方法就是100個case語句,或者100個if ==

其中一個是首選的,或者是全部更好的方法來做到這一點?

我應該澄清,值是恆定的整數。謝謝

回答

1

一種方法是按順序排列值並使用二進制搜索來檢查集合中是否包含值。

你可以把你的價值觀的載體,有序利用std::lower_bound的插入點,然後用std::binary_search來測試成員,或者你可以把你的價值觀在std::set並獲得該功能免費(使用std::set::find()爲會員資格測試)。

有一些小的性能考慮,可能會使任一選項更可取;配置文件並自行決定。

第二種方法是將你的值放在一個散列表中,如std::unordered_set(或者靜態等價的某種靜態等價物)。

2

如果任何一個離散值的最大值足夠小,標誌設置爲true或false取決於該條目是否在列表中應該是非常優化的 - 假設值的出現幾乎具有相同的概率。

1

假設這些值是常數,您當然可以使用switch語句。編譯器可以非常有效地使用二進制搜索類型方法或表[或者表和二進制搜索的組合]執行此操作。 if語句的長列表效率不高,除非您對數字進行排序並製作二進制搜索類型方法 - 開關語句更容易生成,因爲編譯器會梳理出確定數字的最佳方法在列表中,哪些不是。

如果這些值不是常量,那麼switch-statement顯然不是解決方案。位圖可能工作 - 再次,取決於實際的範圍 - 值是一個很大的範圍,然而這不是一個好的解決方案,因爲它會使用大量的內存[但它可能是最快的方法之一,因爲它只是一個用2^n數除/模的情況,這可以用簡單的>>&操作符完成,然後是一個存儲器讀取]。

相關問題