C++ - 包含 3 个元素的列表的类

C++ - Class for list with 3 elements

本文关键字:列表 元素 包含 C++      更新时间:2023-10-16

>我正在尝试制作一个基本上是关联数组/映射的数据类型,但它将有 3 个元素而不是 2 个元素。它将像这样实现:

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

所以实际上只是一个包含 3 个元素的地图或列表,第一个是唯一键。

是的,这是一个轮盘游戏。我了解如何基本上为每个数字创建一个类,并为每个具有适当属性的数字创建一个单独的实例,但我觉得这会相当低效,因为我可以只列出每个数字及其关联属性。

我在为此创建类方面几乎一无所获。我一直想知道是否有更好的方法可以做到这一点并尝试一下,然后感到沮丧并退出。

首先让我们谈谈数据。 请注意,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 "?";
    }
}

如果需要包含多个数据的关联数组,请在键和数据结构之间创建映射。

例如,如果您只想存储字符串,我建议您在键和向量之间使用映射。然后,您可以根据需要向每个键添加任意数量的字符串,因此它是一个灵活的系统。

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

或者,在你的"轮盘赌桌"类中拥有这种结构。

至于键,

如果你使用文字整数,那么你就有问题了,因为 0 和 00 将是同一个 int,你要么需要字符串键,要么用特殊值(如 -1(在内部指定"00"。然后,您可以创建一个与向量的不同字段相关的枚举,工作原型可能如下所示:

#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;
}