2017-03-26 42 views
1

我試圖使該基本上是一個關聯數組/地圖數據類型,但它必須3個元素,而不是2。這將像這樣被實現:C++ - 班列表3個元素

myTable rouletteBoard; 
rouletteBoard.push.back(0, "Green", "Neither"); 
rouletteBoard.push.back(00, "Green", "Neither"); 
rouletteBoard.push.back(1, "Red", "Odd"); 

所以真的只是一個包含3個元素的地圖或列表,第一個元素是唯一鍵。

是的,這是一個輪盤遊戲。我知道如何基本上爲每個數字創建一個類,併爲每個數字創建一個具有相應屬性的單獨實例,但是我覺得這樣做效率會很低,因爲我只能列出每個數字的相關屬性。

我幾乎沒有爲這個創建類。我一直想知道是否有更好的方法來做到這一點,然後嘗試,然後沮喪和退出。

+1

只需使用'性病的矢量:: tuple's ie'std :: vector >'如果你想確保'int' id是唯一的,那麼創建一個包裝類它包含'std :: vector'並且從0(或者某個東西)增加id,或者你可以使用' std :: find_if'來檢查嘗試創建重複鍵。 – George

+0

如果您想讓0和00成爲唯一鍵,則這些鍵需要是字符串。您的替代方法是將代碼00作爲諸如-1的鍵,但指定其「符號」爲 字符串「00」進行打印。 –

+0

歡迎來到Stack Overflow。有關發佈問題的信息,請務必查看[幫助中心](http://stackoverflow.com/help)。根據你的問題,人們可以提出一些建議,但更有益的問題可能包括你已經嘗試過的。我知道你已經陷入了一段時間,但考慮嘗試一些東西併發布代碼。 –

回答

-1

如果您想要一個包含多個數據的關聯數組,您可以在鍵和數據結構之間創建一個映射。例如在這裏,如果你只想存儲字符串,我會建議使用鍵和矢量之間的映射。然後,您可以根據需要爲每個按鍵添加儘可能多的或儘可能少的字符串,因此它是一個靈活的系統。或者,你的「rouletteBoard」類中有這樣的結構。至於關鍵,如果你使用文字整數,那麼你有一個問題,因爲0和00將是相同的整數,你可能需要字符串鍵或用一個特殊的值來指定「00」,例如-1。然後,您可以創建與載體的不同領域的枚舉,一個工作原型可能看起來像:

#include<iostream> 
#include<map> 
#include<string> 
#include<vector> 

std::map<int, std::vector<std::string>> rouletteBoard; 

enum 
{ 
    name, 
    color, 
    oddeven, 
    property_count 
}; 

std::string colors[] = { "Green", "Black", "Red"}; 

std::string roulette_color(int i) 
{ 
    if (i < 1) return colors[0]; // Green 
    if (i < 11) return colors[1 + (i & 1)]; // Black=Even Red=Odd 
    if (i < 19) return colors[2 - (i & 1)]; // Black=Odd Red=Even 
    if (i < 29) return colors[1 + (i & 1)]; // Black=Even Red=Odd 
    return colors[2 - (i & 1)]; // Black=Even Red=Odd 
} 
int main() 
{ 
    rouletteBoard[-1] = {"00", roulette_color(-1), "Neither"}; 
    rouletteBoard[ 0] = { "0", roulette_color(0), "Neither" }; 

    for(int i = 1; i <=36; ++i) 
    { 
     rouletteBoard[i] = { std::to_string(i), roulette_color(i), (i & 1) ? "Odd" : "Even" }; 
    } 

    for (int i = -1; i <= 36; ++i) 
    { 
     std::cout << rouletteBoard[i][name] << ": " << rouletteBoard[i][color] << ", " << rouletteBoard[i][oddeven] << "\n"; 
    } 

    std::cin.get(); 
    return 0; 
} 
+0

使用矢量來存儲一對字符串效率不高。 –

+0

輪盤賭板上只有大約36塊瓷磚。通過創建一個自定義類來節省多少字節? –

+1

現在有一些類,'std :: pair'和'std :: tuple',它不僅關於節省空間,而且關於做不必要的工作。另外,如果你不需要排序,比'std :: map'更喜歡'std :: unordered_map'(儘管這會使空間變得更加悲觀)。 – Darklighter

0

首先,讓我們來談談數據。請注意,0必須與00區分開來,所以我們不能將它們天真地存儲爲整數。其次,請注意,顏色和奇偶校驗(奇數/偶數)可以從數字中立即得出。沒有必要將它們存儲爲單獨的數據。因此,我們可以這樣做:

struct Pocket { 
    enum class Color { GREEN, RED, BLACK }; 
    enum class Parity { NONE, ODD, EVEN }; 

    Pocket(int8_t num) : number(num) {} 

    int8_t number; // -1 for "00" on American style wheel 

    Parity parity() const { 
     if (number < 1) return Parity::NONE; 
     if (number % 2) return Parity::ODD; 
     return Parity::EVEN; 
    } 

    Color color() const { 
     if (number < 1) return Color::GREEN; 
     if (number % 2) return Color::RED; 
     return Color::BLACK; 
    } 
}; 

然後你就可以做一個簡單的容器:

std::vector<Pocket> wheel; 
for (int8_t ii = is_american ? -1 : 0; ii <= 36; ++ii) { 
    wheel.emplace_back(ii); 
} 

最後,可以打印添加代碼:

std::ostream& operator <<(std::ostream& out, Pocket pocket) { 
    if (pocket.number == -1) return out << "00"; 
    return out << pocket.number; 
} 

const char* to_string(Pocket::Color color) { 
    switch (color) { 
     case Pocket::Color::GREEN: return "Green"; 
     case Pocket::Color::RED: return "Red"; 
     case Pocket::Color::BLACK: return "Black"; 
     default: return "?"; 
    } 
} 
+1

仔細檢查顏色順便說一句,因爲紅色/ bkack奇數/偶數模式作爲標準板切換幾次。 –

+0

我主要關注所有事情,但是這一行讓我感到困惑:'std :: ostream&operator <<(std :: ostream&out,口袋裏的口袋)' - 和'return out <<' - 我只是不熟悉用這些。 – Ebar

+0

編輯到我最後的評論 - 只是設法發現,這就是你如何讓cout接受自定義數據類型?這就是你超載的方式。以前從未這樣做過。 – Ebar