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