2017-03-26 25 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