Tìm hiểu thuật toán tổng quát trong lập trình phần 2 ppt

8 440 0
Tìm hiểu thuật toán tổng quát trong lập trình phần 2 ppt

Đang tải... (xem toàn văn)

Thông tin tài liệu

9 Chương 10: Thuật toán tổng quát  Ví dụ sử dụng ₫ốitượ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 << "First number > 4 is " << *p1; if (p2 != alast) cout << "First number < 4 is " << *p2; p1 = find_elem(a,alast,4,Greater()); p2 = find_elem(a,alast,4,Less()); char c; cin >> c; } 10 Chương 10: Thuật toán tổng quát Ưu ₫iểmcủa ₫ốitượng hàm  Đốitượng hàm có thể chứatrạng thái  Hàm toán tử () có thể₫ịnh nghĩa inline => tăng hiệusuất template <typename OP> 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; } }; 11 Chương 10: Thuật toán tổng quát class 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 << ' ';} }; void main() { int a[] = {1, 2, 3, 4, 5, 6, 7}; Sum sum_op; Prod prod_op; apply(a,a+7,sum_op); cout << sum_op.value() << endl; apply(a,a+7,prod_op); cout << prod_op.value() << endl; apply(a,a+7,Negate()); apply(a,a+7,Print()); char c; cin >> c; } 12 Chương 10: Thuật toán tổng quát Kếthợp2 bướctổng quát hóa template <typename T, typename COMP> T* find_elem(T* first, T* last, T k, COMP comp) { while (first != last && !comp(*first, k)) ++first; return first; } template <typename T, typename OP> void apply(T* first, T* last, OP& op) { while (first != last) { op(*first); ++first; } } 13 Chương 10: Thuật toán tổng quát Khuôn mẫulớpchocác₫ốitượng hàm template <typename T> struct Greater{ bool operator()(const T& a, const T& b) { return a > b; } }; template <typename T> struct Less{ bool operator()(const T& a, const T& b) { return a > b; } }; template <typename T> 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; } }; 14 Chương 10: Thuật toán tổng quát template <typename T> struct Negate { void operator()(T& k) { k = -k;} }; template <typename T> struct Print { void operator()(const T& k) { cout << k << ' ';} }; void main() { int a[] = { 1, 3, 5, 2, 7, 9, 6 }; int* alast = a+7; int* p1 = find_elem(a,alast,4,Greater<int>()); int* p2 = find_elem(a,alast,4,Less<int>()); if (p1 != alast) cout << "\nFirst number > 4 is " << *p1; if (p2 != alast) cout << "\nFirst number < 4 is " << *p2; Sum<int> sum_op; apply(a,a+7,sum_op); cout<< "\nSum of the sequence " << sum_op.value() << endl; apply(a,a+7,Negate<int>()); apply(a,a+7,Print<int>()); char c; cin >> c; } 15 Chương 10: Thuật toán tổng quát 10.3 Tổng quát hóa truy lặpphầntử  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ỏ) — 16 Chương 10: Thuật toán tổng quát Ví dụ thuậttoáncopy  Áp dụng cho kiểumảng thô template <class T> void copy(const T* s, T* d, int n) { while (n ) { *d = *s; ++s; ++d; } }  Áp dụng cho kiểuVector template <class T> void copy(const Vector<T>& s, Vector<T>& d) { for (int i=0; i < s.size(); ++i) d[i] = s[i]; }  Áp dụng cho kiểuList template <class T> void copy(const List<T>& s, List<T>& d) { ListItem<T> *sItem=s.getHead(), *dItem=d.getHead(); while (sItem != 0) { dItem->data = sItem->data; dIem = dItem->getNext(); sItem=sItem->getNext(); } } . c; cin >> c; } 15 Chương 10: Thuật toán tổng quát 10.3 Tổng quát hóa truy lặpphầntử  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,. endl; apply(a,a+7,Negate()); apply(a,a+7,Print()); char c; cin >> c; } 12 Chương 10: Thuật toán tổng quát Kếthợp2 bướctổng quát hóa template <typename T, typename COMP> T* find_elem(T* first,. find_elem(a,alast,4,Greater()); p2 = find_elem(a,alast,4,Less()); char c; cin >> c; } 10 Chương 10: Thuật toán tổng quát Ưu ₫iểmcủa ₫ốitượng hàm  Đốitượng hàm có thể chứatrạng thái  Hàm toán tử () có thể₫ịnh

Ngày đăng: 31/07/2014, 04:20

Từ khóa liên quan

Mục lục

  • Kỹ thuật lập trình

  • Nội dung chương 10

  • 10.1 Tổng quát hóa kiểu dữ liệu phần tử

  • 10.2 Tổng quát hóa phép toán cơ sở

  • Tham số khuôn mẫu cho phép toán

  • Ưu điểm của đối tượng hàm

  • Kết hợp 2 bước tổng quát hóa

  • Khuôn mẫu lớp cho các đối tượng hàm

  • 10.3 Tổng quát hóa truy lặp phần tử

  • Ví dụ thuật toán copy

  • Ví dụ thuật toán find_max

  • Bộ truy lặp (iterator)

  • Bổ sung bộ truy lặp cho kiểu Vector

  • Bổ sung bộ truy lặp cho kiểu List

  • Khuôn mẫu List cải tiến

  • Bài tập về nhà

Tài liệu cùng người dùng

Tài liệu liên quan