std::partition

需 #include <algorithm>,std::partition 可以根據指定條件將 array 分成兩群。

FwdIt partition(FwdIt first, const FwdIt last, Pr pred);

將傳入的 [first, last) 區間,根據 pred 的條件分成兩群,回傳值是第二群第一個元素的 iterator。符合條件的在 [first, 回傳值),不符條件的在 [回傳值, last)。

那我們可以怎麼使用它呢?

假設現在有一堆股票,我們想要選出股價介於 300 至 500 的股票。

struct Stock {
    std::string name;
    double price;
    unsigned long volume;
};

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}
};

可以這樣寫。

auto pos = std::partition(stocks.begin(), stocks.end(), [](const Stock& stock) {
            // 找成交價介於 300 到 500 的股票
            return 300 <= stock.price && stock.price <= 500;
        });

這樣 [stocks.begin(), pos) 就是股價在區間 [300, 500] 的股票了。

完整程式如下:

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} };

    // before partition
    std::cout << “before partition:\n{商品名, 成交價, 總量}\n”;
    for (const auto& stock : stocks) {
        std::cout << “{” << stock.name << “, ” << stock.price << “, ” << stock.volume << “}\n”;
    }

    std::cout << “\n”;

    std::pair<double, double> partition(300, 500);
    // pos 為第二群第一個元素
    auto pos = std::partition(stocks.begin(), stocks.end(), [&partition](const Stock& stock) {              // 找成交價介於 300 到 500 的股票
            return partition.first <= stock.price && stock.price <= partition.second;
        });

    // after partition
    std::cout << “after partition:\n{商品名, 成交價, 總量}\n”;
    for (auto it = stocks.begin(); it != pos; ++it) {
        std::cout << “{” << it->name << “, ” << it->price << “, ” << it->volume << “}\n”;
    }

    std::cout << “以上商品價格介於 ” << partition.first << ” 到 ” << partition.second << std::endl;

    for (auto it = pos, end = stocks.end(); it != end; ++it) {
        std::cout << “{” << it->name << “, ” << it->price << “, ” << it->volume << “}\n”;
    }

    std::cout << ‘\n’;

    return 0;
}

std::partition

發佈留言