std::partial_sort

在寫看盤軟體時,一定會遇到欄位的排序問題。

假設現在想要按照價格由小到大排序,而螢幕只能顯示 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’;
}

發佈留言