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