2010-06-24 45 views
0

我正在嘗試將數字電子問題適應於基於C++ STL的程序。C++的case聲明?

本來我有4個輸入C1,C2,C3,C4。這意味着我有一個總的16種組合:

0000 
0001 
. 
. 
. 
1111 

我具有由

typedef std::pair<int, int> au_pair; //vertices 
typedef std::pair<int, int> acq_pair; //ch qlty 
typedef std::multimap<int, acq_pair> au_map; 
typedef au_map::iterator It_au; 

的沒有限定的多重映射。的模擬取決於au_map的大小。 例如:如果au_map.size() = 5我會有C1,C2,C3,C4,C5。因此2^5 = 32例。

例如: 如果au_map.size()=4,我需要模擬我的算法16例。

for(It_au it = a_map.begin(); it != a_map.end(); it++) 
{ 
    acq_pair it1 = it->second; 
    //case 0: 
    //C3 = 0, C2 = 0, C1 = 0, C0 = 0 
    //Update it1.second with corresponding C values 

    //simulate algorithm 

    //case 1: 
    //C3 = 0, C2 = 0, C1 = 0, C0 = 1 
    //simulate 

    ......... 
    //case 15: 
    //C3 = 1, C2 = 1, C1 = 1, C0 = 1 
    //simulate 

} 

回答

1

不是最好的主意。現在,您正在通過手動設置C1-C4並在for循環中編寫一些仿真例程來做大量無用的工作。

將其自動化。

使用一些摘要State-Simulator映射器(其中Simulator實際上代表了一些具體的功能對象)。

typedef char State; 

struct basic_simulator { 
    // You could also pass some other parameters to your 
    // simulator 
    virtual void operator()(...) = 0 
}; 

struct concrete_simulator : public basic_simulator { 
    virtual void operator()(...) { 
     // Do something concrete 
     // Trolololo 
    } 
}; 

typedef basic_simulator Simulator; 

而且在這種情況下,您的實際包裝看起來像std::map<State, Simulator*> map;


你需要做下一步要做的手段越來越C1-C4從它被定義爲char你的狀態值是什麼。使用按位運算符。

您所有的狀態都可以定義爲0-15轉換爲二進制數字(2 -> 0010)。因此,要獲得C1-C4值,你就只需要做出相應的轉變:

// C1 C2 C3 C4 
// ----------- 
// 1 1 1 1 
State state = 15; 

for (int i = 3; i >= 0; i--) { 
    // State of some of the inputs, defined by one bit 
    InputState C_xx = ((state >> i) & 1); 
} 

現在只是所有這些0-15狀態映射到適當的模擬仿函數:

std::map<State, Simulator*> mapper; 
// Generally speaking, you should use some sort of 
// smart pointer here 
mapper[0] = new concrete_simulator(...); 
mapper[1] = ... 

什麼是真正的酷是例如,你可能只有3或4個具體的模擬器,這些模擬器會相應地映射到某些狀態。

在這種情況下調用實際模擬將意味着類似:

// Fire appropriate simulation object 
    (*(mapper[actual_state]))(...); 

,並盡一切可能的仿真是指循環訪問每個地圖元素。


更新:同樣的技術可用於其中必須超過輸入狀態/單輸入狀態可以具有多於可能的值。

只要寫一個合適的映射函數和狀態發生器即可。

+0

爲什麼std :: map更喜歡std :: vector?你肯定會獲得更好的性能與std :: vector。 – andand 2010-06-24 15:41:07

+0

@andand在16個狀態的情況下 - 是 - 'std :: vector'中的'O(N)'查找時間將比'std :: map'中的'O(log N)'查找時間好。但僅僅因爲狀態數量增長爲'A^N',其中'A'代表可能的值,'N'代表輸入數字,'std :: map'會給出更好的漸近性能。 **並且是 - 爲什麼在性能分析之前談論性能?** – 2010-06-24 15:49:46

+0

@andand另外值得一提的是,'std :: map'可以很容易地切換到例如'boost :: unordered_map',賦予'O(1)'查找時間。 – 2010-06-24 15:51:06

0

哼......爲什麼不讓for循環爲你列舉各種組合?

for (size_t i = 0; i != 16; ++i) 
{ 
    bool const c1 = i & 1; 
    bool const c2 = i & 2; 
    bool const c3 = i & 4; 
    bool const c4 = i & 8; 

    // your algorithm 
} 

比手工設置要容易一點。