相同邏輯因參數類型不同無法合併,導致 maxInt、maxLong、maxFloat… 滋生冗餘。C 巨集雖能複用但無類型安全。
將算法與其操作的資料結構分離,並將後者最大程度泛化,基於參數多態實現算法最大重用。
| 要素 | 角色 | 抽象對應 |
|---|---|---|
| Algorithm(算法) | 一系列可行步驟 | 脊椎 |
| Container(容器) | 資料集合 | 抽象陣列(肉) |
| Iterator(迭代器) | 算法與容器介面 | 抽象指標/游標 |
「算法串聯資料,資料實化算法。」
template <class Iterator, class Act, class Test>
void process(Iterator begin, Iterator end, Act act, Test test) {
for (; begin != end; ++begin)
if (test(*begin)) act(*begin);
}
六道看似無關題目(素數求和、完全平方數開根號、及格生名單、二元樹重新著色、字串反向拷貝、非數字字元過濾)共性:對指定範圍內滿足條件的元素執行動作。上述 process 一次解決。
bool notDigit(char c) { return c < '0' || c > '9'; }
void printNonDigit(char c) { cout << c << "不是數字字符" << endl; }
int main() {
process(istream_iterator<char>(cin), istream_iterator<char>(),
printNonDigit, notDigit);
}
istream_iterator 將標準輸入包裝為容器,無顯式 I/O 迴圈,極致抽象。