Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于字符串变量设置的规则进行排序_C++_Qt_Sorting_C++11 - Fatal编程技术网

C++ 基于字符串变量设置的规则进行排序

C++ 基于字符串变量设置的规则进行排序,c++,qt,sorting,c++11,C++,Qt,Sorting,C++11,在我假设的应用程序中,我从服务器收到一个酒店列表 struct Hotel { std::string name; // e.g. Hilton, Ritz int stars; // In range [0..5], 0 stands for "unrated" int freeRoomCount; // Number of available rooms [0..N] int parkingPla

在我假设的应用程序中,我从服务器收到一个酒店列表

struct Hotel 
{
  std::string name;            // e.g. Hilton, Ritz
  int stars;                   // In range [0..5], 0 stands for "unrated"
  int freeRoomCount;           // Number of available rooms [0..N]
  int parkingPlacesAvailable;  // Number of parking places availalble [0..M]
}
std::vector<Hotel> hotels;
问题是:如何在C++中解释这个问题?枚举和位掩码值不起作用,因为它们不提供“顺序”控件

我很好奇社区将如何解决这类任务?我觉得有一种方法可以解决这类问题,这就是为什么我不想直截了当地编写如下代码:

if (sortingRules[0] == "s") ...

我正在使用C++11和Qt5.4。没有提升。

例如,您可以在他们的选择和要排序的函子之间建立映射

using SortFun = bool(*)(Hotel const&, Hotel const&);
std::map<char, SortFun> sorters {
    {'s', [](Hotel const& lhs, Hotel const& rhs){ return lhs.stars < rhs.stars; }},
    {'f', [](Hotel const& lhs, Hotel const& rhs){ return lhs.freeRoomCount < rhs.freeRoomCount; }},
    {'p', [](Hotel const& lhs, Hotel const& rhs){ return lhs.parkingPlacesAvailable < rhs.parkingPlacesAvailable; }}
};
输出将是()


要从最高到最低排序,只需将lambda函数中的所有
切换到code>。

我将使用一个简单的解析器来读取字符,对字符的关联比较谓词应用
std::stable\u排序


稳定排序部分非常重要。这意味着,如果您先按星数排序,然后按停车位排序,则星数的顺序将保持不变。

您打算用结构变量生成结构数组吗?@bobtheboy我想没有。我只是尝试给出一个通用示例。实际上,我有一组具有接口的类,这些接口提供了“int stars()”、“int freeRoomCount()”和“int parkingPlacesAvailable()”等方法。当我用这些类填充UI列表视图时,我应该依赖“std::string”排序规则。您可以使用std::sort吗?演示如何使用比较函数,排序规则字符串可以在那里使用。我也会这样做。您所需要的只是一个函数,它有一个基于单个字符代码的开关,用于如何排序;你可以考虑做第一个排序不稳定作为一个可能的优化(如果你经常排序一个键,或者如果有很多重复的键)感谢很多家伙。我喜欢这个C++11解决方案!
using SortFun = bool(*)(Hotel const&, Hotel const&);
std::map<char, SortFun> sorters {
    {'s', [](Hotel const& lhs, Hotel const& rhs){ return lhs.stars < rhs.stars; }},
    {'f', [](Hotel const& lhs, Hotel const& rhs){ return lhs.freeRoomCount < rhs.freeRoomCount; }},
    {'p', [](Hotel const& lhs, Hotel const& rhs){ return lhs.parkingPlacesAvailable < rhs.parkingPlacesAvailable; }}
};
int main()
{
    using SortFun = bool(*)(Hotel const&, Hotel const&);
    std::map<char, SortFun> sorters {
        {'s', [](Hotel const& lhs, Hotel const& rhs){ return lhs.stars < rhs.stars; }},
        {'f', [](Hotel const& lhs, Hotel const& rhs){ return lhs.freeRoomCount < rhs.freeRoomCount; }},
        {'p', [](Hotel const& lhs, Hotel const& rhs){ return lhs.parkingPlacesAvailable < rhs.parkingPlacesAvailable; }}
    };

    std::vector<Hotel> hotels {{"foo", 5, 4, 10},
                               {"bar", 3, 8, 20},
                               {"baz", 4, 5, 15},
                               {"fab", 3, 6, 18}};

    std::string choice;
    std::cout << "Pick a sort criteria s, f, p: ";
    std::cin >> choice;

    for (auto rit = choice.rbegin(); rit != choice.rend(); ++rit)
    {
        auto match = sorters.find(*rit);
        if (match != sorters.end())
        {
            std::stable_sort(begin(hotels), end(hotels), match->second);
        }
    }

    for(auto const& hotel : hotels)
    {
        std::cout << "Name: " << hotel.name << " Stars: " << hotel.stars << " Rooms: " << hotel.freeRoomCount << " Parking: " << hotel.parkingPlacesAvailable << std::endl;
    }
}
Pick a sort criteria s, f, p: sf
Name: fab Stars: 3 Rooms: 6 Parking: 18
Name: bar Stars: 3 Rooms: 8 Parking: 20
Name: baz Stars: 4 Rooms: 5 Parking: 15
Name: foo Stars: 5 Rooms: 4 Parking: 10