当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法以特定的方式显示cpp图

郏兴贤
2023-03-14

我需要向用户显示以下座位并能够预订和取消预订。

    std::map<std::string, int> seats{ {"1A", 0}, {"1B", 0}, {"1C", 0}, {"1D", 0},{"1E", 0},
                                {"2A", 0}, {"2B", 0}, {"2C", 0}, {"2D", 0},{"2E", 0},
                                {"3A", 0}, {"3B", 0}, {"3C", 0}, {"3D", 0},{"3E", 0},
                                {"4A", 0}, {"44", 0}, {"4C", 0}, {"4D", 0},{"4E", 0},
                                {"5A", 0}, {"5B", 0}, {"5C", 0}, {"5D", 0},{"5E", 0},
                                {"6A", 0}, {"6B", 0}, {"6C", 0}, {"6D", 0},{"6E", 0},
                                {"7A", 0}, {"7B", 0}, {"7C", 0}, {"7D", 0},{"7E", 0},
                                {"8A", 0}, {"8B", 0}, {"8C", 0}, {"8D", 0},{"8E", 0},
                                {"9A", 0}, {"9B", 0}, {"9C", 0}, {"9D", 0},{"9E", 0},
                                {"10 A", 0}, {"10B", 0}, {"10C", 0}, {"10D", 0},{"10E", 0},
                                {"11 A", 0}, {"11B", 0}};

我也尝试了unordered_map,但无论我做什么,我都无法使map以我想要的方式显示座位(1A,1B,1C,1D,1E)。

1A 1B 1C 1D 1E

2A 2B 2C 2D 2E...

尝试将座位名称更改为A1 B1 C1 D1...显然,我是C++新手。我知道地图是有序的,并且我知道使用unordered_map无法保证地图的显示方式。

我的问题是,我可以使用地图在一个特定的方式,所以我可以显示它的方式,我想要。或者,在C++中是否有另一种数据结构可以用于我的任务。

阵列是我的第一选择,然而,我发现很难跟踪哪个座位出售和处理取消。现在我可以使用两个数组,一个数组用于字符串表示,一个数组用于处理保留和取消操作。

谁能给我一个解决这个问题的建议吗?

共有1个答案

高恺
2023-03-14

您可以放入一个自定义比较器来按照您想要的顺序对映射中的数据进行排序

对此,您可以参考以下代码:

    auto seatCompare = [](std::string const& seat1, std::string const& seat2) -> bool {
        std::smatch result1;
        std::smatch result2;
        std::regex pattern(R"(([0-9]+)([a-z A-Z]+))");
        if (!regex_match(seat1, result1, pattern) || !regex_match(seat2, result2, pattern)) {
            throw std::runtime_error("Seat name invalid!");
        }
        if (std::stoi(result1[1]) == std::stoi(result2[1])) {
            return result1[2] < result2[2];
        }
        return std::stoi(result1[1]) < std::stoi(result2[1]);
    };
    std::map<std::string, int, decltype(seatCompare)> seats(seatCompare);
    seats = { {"1A", 0}, {"1B", 0}, {"1C", 0}, {"1D", 0},{"1E", 0},
              {"2A", 0}, {"2B", 0}, {"2C", 0}, {"2D", 0},{"2E", 0},
              {"3A", 0}, {"3B", 0}, {"3C", 0}, {"3D", 0},{"3E", 0},
              {"4A", 0}, {"4B", 0}, {"4C", 0}, {"4D", 0},{"4E", 0},
              {"5A", 0}, {"5B", 0}, {"5C", 0}, {"5D", 0},{"5E", 0},
              {"6A", 0}, {"6B", 0}, {"6C", 0}, {"6D", 0},{"6E", 0},
              {"7A", 0}, {"7B", 0}, {"7C", 0}, {"7D", 0},{"7E", 0},
              {"8A", 0}, {"8B", 0}, {"8C", 0}, {"8D", 0},{"8E", 0},
              {"9A", 0}, {"9B", 0}, {"9C", 0}, {"9D", 0},{"9E", 0},
              {"10A", 0}, {"10B", 0}, {"10C", 0}, {"10D", 0},{"10E", 0},
              {"11A", 0}, {"11B", 0}};

或C++98样式

struct SeatCompare {
    bool operator()(std::string const& seat1, std::string const& seat2)
    {
        std::smatch result1;
        std::smatch result2;
        std::regex pattern(R"(([0-9]+)([a-z A-Z]+))");
        if (!regex_match(seat1, result1, pattern) || !regex_match(seat2, result2, pattern)) {
            throw std::runtime_error("Seat name invalid!");
        }
        if (std::stoi(result1[1]) == std::stoi(result2[1])) {
            return result1[2] < result2[2];
        }
        return std::stoi(result1[1]) < std::stoi(result2[1]);
    }
};

std::map<std::string, int, SeatCompare> seats{ 
    {"1A", 0}, {"1B", 0}, {"1C", 0}, {"1D", 0},{"1E", 0},
    {"2A", 0}, {"2B", 0}, {"2C", 0}, {"2D", 0},{"2E", 0},
    {"3A", 0}, {"3B", 0}, {"3C", 0}, {"3D", 0},{"3E", 0},
    {"4A", 0}, {"4B", 0}, {"4C", 0}, {"4D", 0},{"4E", 0},
    {"5A", 0}, {"5B", 0}, {"5C", 0}, {"5D", 0},{"5E", 0},
    {"6A", 0}, {"6B", 0}, {"6C", 0}, {"6D", 0},{"6E", 0},
    {"7A", 0}, {"7B", 0}, {"7C", 0}, {"7D", 0},{"7E", 0},
    {"8A", 0}, {"8B", 0}, {"8C", 0}, {"8D", 0},{"8E", 0},
    {"9A", 0}, {"9B", 0}, {"9C", 0}, {"9D", 0},{"9E", 0},
    {"10A", 0}, {"10B", 0}, {"10C", 0}, {"10D", 0},{"10E", 0},
    {"11A", 0}, {"11B", 0}};
 类似资料: