在寫看盤軟體時,一定會遇到欄位的排序問題。
假設現在想要按照價格由小到大排序,而螢幕只能顯示 40 檔股票,但全部股票有 10,000 檔,那就沒有必要全部排完序,然後只擷取前 40 檔股票顯示,只要最小的 40 檔按順序排完即可。
有沒有這種函式呢?有的。
std::partial_sort 就是這種函式,直接來看 code:
首先 #include <algorithm>。
假設有股票資料結構如下:
struct Stock {
std::string name;
double price;
unsigned long volume;
};
現在使用者點擊 price 欄,程式需要按 price 由小到大顯示股票,而手機螢幕只夠顯示 5 檔股票,原始資料如下:
std::vector<Stock> stocks = {
{“2201.TW”, 18.45, 2449},
{“2723.TW”, 138.0, 1010},
{“3008.TW”, 3835, 650},
{“1521.TW”, 56.3, 29},
{“4107.TW”, 106.5, 152},
{“2059.TW”, 307.0, 297},
{“5274.TW”, 1100, 172},
{“3293.TW”, 593, 819},
{“2330.TW”, 304.5, 51234},
{“5904.TW”, 472.0, 163} };
程式呼叫 std::partial_sort,前 5 個元素排好就停止,寫法如下:
std::partial_sort(stocks.begin(), stocks.begin() + 5, stocks.end(),
[](const Stock& lhs, const Stock& rhs) {
return lhs.price < rhs.price;
}
);
參數表示
1. 排序的範圍是 [stocks.begin(), stocks.end())。
2. 最小 5 檔按順序大小排完即停止 [stocks.begin(), stocks.begin() + 5)。
3. 比較方式是取 Stock 結構的 price 成員變數,即按價格排序。
[](const Stock& lhs, const Stock& rhs) {
return lhs.price < rhs.price;
}
顯示結果:
完整程式如下:
#include <algorithm>
struct Stock {
std::string name;
double price;
unsigned long volume;
};
int main()
{
std::vector<Stock> stocks = {
{“2201.TW”, 18.45, 2449},
{“2723.TW”, 138.0, 1010},
{“3008.TW”, 3835, 650},
{“1521.TW”, 56.3, 29},
{“4107.TW”, 106.5, 152},
{“2059.TW”, 307.0, 297},
{“5274.TW”, 1100, 172},
{“3293.TW”, 593, 819},
{“2330.TW”, 304.5, 51234},
{“5904.TW”, 472.0, 163}
};
std::cout << “before partial_sort:n{ Name, Price, Volume}n”;
for (const auto& stock : stocks)
{
std::cout << “{” << stock.name << “, ” << std::setw(5) << stock.price << “, ” << std::setw(6) << stock.volume << “}n”;
}
std::partial_sort(stocks.begin(), stocks.begin() + 5, stocks.end(), [](const Stock& lhs, const Stock& rhs) {
return lhs.price < rhs.price;
}); // 前 5 個元素排好序就停止
std::cout << “nafter partial_sort:n{ Name, Price, Volume}n”;
for (const auto& stock : stocks)
{
std::cout << “{” << stock.name << “, ” << std::setw(5) << stock.price << “, ” << std::setw(6) << stock.volume << “}n”;
}
std::cout << ‘n’;
}
留言
張貼留言