Thông tin tài liệu:
Ưu ₫iểm của ₫ối tượng hàmĐối tượng hàm có thể chứa trạng thái Hàm toán tử () có thể ₫ịnh nghĩa inline = tăng hiệu suấttemplate void apply(int* first, int* last, OP& op) { while (first != last) { op(*first); ++first; } } class Sum { int val; public:
Nội dung trích xuất từ tài liệu:
Tìm hiểu thuật toán tổng quát trong lập trình phần 2 Ví dụ sử dụng ₫ối tượng hàm void main() { int a[] = { 1, 3, 5, 2, 7, 9, 6 }; int* alast = a+7; Greater greater; Less less; int* p1 = find_elem(a,alast,4,greater); int* p2 = find_elem(a,alast,4,less); if (p1 != alast) cout Ưu ₫iểm của ₫ối tượng hàm Đối tượng hàm có thể chứa trạng thái Hàm toán tử () có thể ₫ịnh nghĩa inline => tăng hiệu suất template void apply(int* first, int* last, OP& op) { while (first != last) { op(*first); ++first; } } class Sum { int val; public: Sum(int init = 0) : val(init) {} void operator()(int k) { val += k; } int value() const { return val; } }; 10Chương 10: Thuật toán tổng quátclass Prod { int val;public: Prod(int init=1): val(init) {} void operator()(int k) { val *= k; } int value() const { return val; }};struct Negate {void operator()(int& k) { k = -k;} };struct Print { void operator()(int& k) { cout Kết hợp 2 bước tổng quát hóa template T* find_elem(T* first, T* last, T k, COMP comp) { while (first != last && !comp(*first, k)) ++first; return first; } template void apply(T* first, T* last, OP& op) { while (first != last) { op(*first); ++first; } } 12Chương 10: Thuật toán tổng quátKhuôn mẫu lớp cho các ₫ối tượng hàm template struct Greater{ bool operator()(const T& a, const T& b) { return a > b; } }; template struct Less{ bool operator()(const T& a, const T& b) { return a > b; } }; template class Sum { T val; public: Sum(const T& init = T(0)) : val(init) {} void operator()(const T& k) { val += k; } T value() const { return val; } }; 13Chương 10: Thuật toán tổng quáttemplate struct Negate { void operator()(T& k) { k = -k;}};template struct Print { void operator()(const T& k) { cout 10.3 Tổng quát hóa truy lặp phần tử Vấn ₫ề 1: Một thuật toán (tìm kiếm, lựa chọn, phân loại, tính tổng, ...) áp dụng cho một mảng, một vector, một danh sách họăc một cấu trúc khác thực chất chỉ khác nhau ở cách truy lặp phần tử Vấn ₫ề 2: Theo phương pháp truyền thống, ₫ể truy lặp phần tử của một cấu trúc container, nói chung ta cần biết cấu trúc ₫ó ₫ược xây dựng như thế nào — Mảng: Truy lặp qua chỉ số hoặc qua con trỏ — Vector: Truy lặp qua chỉ số — List: Truy lặp qua quan hệ móc nối (sử dụng con trỏ) — ... 15Chương 10: Thuật toán tổng quátVí dụ thuật toán copy Áp dụng cho kiểu mảng thô template void copy(const T* s, T* d, int n) { while (n--) { *d = *s; ++s; ++d; } } Áp dụng cho kiểu Vector template void copy(const Vector& s, Vector& d) { for (int i=0; i < s.size(); ++i) d[i] = s[i]; } Áp dụng cho kiểu List template void copy(const List& s, List& d) { ListItem *sItem=s.getHead(), *dItem=d.getHead(); while (sItem != 0) { dItem->data = sItem->data; dIem = dItem->getNext(); sItem=sItem->getNext(); } } 16Chương 10: Thuật toán tổng quát