SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Thư viện chuẩn C++
Standard Template Library (STL)
Thư viện khuôn mẫu chuẩn - STL

 • Thư viện chuẩn C++ bao gồm 32 header file

<algorithm>    <ios>        <map>       <stack>
<bitset>       <iosfwd>     <memory>    <stdexcept>
<complex>      <iostream>   <new>       <streambuf>
<deque>        <istream>    <numeric>   <string>
<exception>    <iterator>   <ostream>   <typeinfo>
<fstream>      <limits>     <queue>     <utility>
<functional>   <list>       <set>       <valarray>
<iomanip>      <locale>     <sstream>   <vector>
Thư viện khuôn mẫu chuẩn - STL
• Thư viện chuẩn C++ gồm 2 phần:
  – Lớp string
  – Thư viện khuôn mẫu chuẩn – STL
• Ngoại trừ lớp string, tất cả các thành phần còn
  lại của thư viện đều là các khuôn mẫu
• Tác giả đầu tiên của STL là Alexander Stepanov,
  mục đích của ông là xây dựng một cách thể hiện
  tư tưởng lập trình tổng quát
Thư viện khuôn mẫu chuẩn - STL
• Các khái niệm trong STL được phát triển độc
  lập với C++
  – Do đó, ban đầu, STL không phải là một thư viện C++,
    mà nó đã được chuyển đổi thành thư viện C++
  – Nhiều tư tưởng dẫn đến sự phát triển của STL đã
    được cài đặt phần nào trong Scheme, Ada, và C
Thư viện khuôn mẫu chuẩn - STL
• Một số lời khuyên về STL
  – STL được thiết kế đẹp và hiệu quả - không có thừa
    kế hay hàm ảo trong bất kỳ định nghĩa nào
  – Từ tư tưởng lập trình tổng quát dẫn tới những "khối
    cơ bản" (building block) mà có thể kết hợp với nhau
    theo đủ kiểu
  – Tuy làm quen với STL tốn không ít thời gian nhưng
    thành quả tiềm tàng về năng xuất rất xứng đáng với
    thời gian đầu tư
  – Tóm lại – hãy học và hãy sử dụng!
• Bài giảng này chỉ để giới thiệu một phần rất nhỏ
  của STL
Giới thiệu STL
• Ba thành phần chính của STL
  – Các thành phần rất mạnh xây dựng dựa trên
    template
     • Container: các cấu trúc dữ liệu template
     • Iterator: giống con trỏ, dùng để truy nhập
       các phần tử dữ liệu của các container
     • Algorithm: các thuật toán để thao tác dữ
       liệu, tìm kiếm, sắp xếp, v.v..
Giới thiệu về các Container
• 3 loại container
  – Sequence container – container chuỗi
     • các cấu trúc dữ liệu tuyến tính (vector, danh sách liên
       kết)
     • first-class container
     • vector, deque, list
  – Associative container – container liên kết
     •   các cấu trúc phi tuyến, có thể tìm phần tử nhanh chóng
     •   first-class container
     •   các cặp khóa/giá trị
     •   set, multiset, map, multimap
  – Container adapter – các bộ tương thích container
     • stack, queue, priority_queue
Các hàm thành viên STL
• Các hàm thành viên mọi container đều có
  –   Default constructor, copy constructor, destructor
  –   empty
  –   max_size, size
  –   = < <= > >= == !=
  –   swap
• Các hàm thành viên của first-class container
  – begin, end
  – rbegin, rend
  – erase, clear
Giới thiệu về Iterator
• Iterator tương tự như con trỏ
  – trỏ tới các phần tử trong một container
  – các toán tử iterator cho mọi container
     •   * truy nhập phần tử được trỏ tới
     •   ++ trỏ tới phần tử tiếp theo
     •   begin() trả về iterator trỏ tới phần tử đầu tiên
     •   end() trả về iterator trỏ tới phần tử đặc biệt chặn
         cuối container
Các loại Iterator
• Input                      (ví dụ: istream_iterator)
   – Đọc các phần tử từ một container, hỗ trợ ++,+= (chỉ tiến)
• Output                     (ví dụ: ostream_iterator)
   – Ghi các phần tử vào container, hỗ trợ ++,+= (chỉ tiến)
• Forward                    (ví dụ: hash_set<T> iterator)
   – Kết hợp input iterator và output iterator
   – Multi-pass (có thể duyệt chuỗi nhiều lần)
• Bidirectional              (Ví dụ: list<T> iterator)
   – Như forward iterator, nhưng có thể lùi (--,-=)
• Randomaccess               (Ví dụ: vector<T> iterator)
   – Như bidirectional, nhưng còn có thể nhảy tới phần tử tùy ý
Các loại Iterator được hỗ trợ
• Sequence container
   – vector: random access
   – deque: random access
   – list: bidirectional
• Associative container
  (hỗ trợ các loại bidirectional)
   – set, multiset,map, multimap
• Container adapter (không hỗ trợ iterator)
   – stack, queue, priority_queue
Các phép toán đối với Iterator
• Input iterator
   – ++ , =*p , -> , == , !=
• Output iterator
   – ++ , *p= , p = p1
• Forward iterator
   – Kết hợp các toán tử của input và output iterator
• Bidirectional iterator
   – các toán tử cho forward, và --
• Random iterator
   – các toán tử cho bidirectional, và
     + , +=, -, -=, >, >=, <, <=,[]
Giới thiệu các thuật toán – Algorithm
 • STL có các thuật toán được sử dụng tổng quát
   cho nhiều loại container
   – thao tác gián tiếp với các phần tử qua các iterator
   – thường dùng cho các phần tử trong một chuỗi
      • chuỗi xác định bởi một cặp iterator trỏ tới phần tử
        đầu tiên và cuối cùng của chuỗi
   – các thuật toán thường trả về iterator
      • ví dụ: find() trả về iterator trỏ tới phần tử cần tìm
        hoặc trả về end() nếu không tìm thấy
   – sử dụng các thuật toán được cung cấp giúp lập
     trình viên tiết kiệm thời gian và công sức
Sequence Container
• 3 loại sequence container:
  – vector – dựa theo mảng
  – deque – dựa theo mảng
  – list – danh sách liên kết hiệu quả cao
vector Sequence Container
• vector
  – <vector>
  – cấu trúc dữ liệu với các vùng nhớ liên tiếp
     • truy nhập các phần tử bằng toán tử [ ]
  – sử dụng khi dữ liệu cần được sắp xếp và truy nhập
    dễ dàng
• Cơchế hoạt động khi hết bộ nhớ
  – cấp phát một vùng nhớ liên lục lớn hơn
  – tự sao chép ra vùng nhớ mới
  – trả lại vùng nhớ cũ
• sử dụng randomaccess iterator
vector Sequence Container
• Khai báo
   – std::vector <type> v;
      • type là kiểu dữ liệu của phần tử dữ liệu (int, float, v.v..)
• Iterator
   – std::vector<type>::iterator iterVar;
      • trường hợp thông thường
   – std::vector<type>::const_iterator iterVar;
      • const_iterator không thể sửa đổi các phần tử
   – std::vector<type>::reverse_iterator iterVar;
      • Visits elements in reverse order (end to beginning)
      • Use rbegin to get starting point
      • Use rend to get ending point
vector Sequence Container
• Các hàm thành viên của vector
  – v.push_back(value)
     • thêm phần tử vào cuối (sequence container nào cũng
       có hàm này).
  – v.size()
     • kích thước hiện tại của vector
  – v.capacity()
     • kích thước có thể lưu trữ trước khi phải cấp phát lại
     • khi cấp phát lại sẽ cấp phát kích thước gấp đôi
  – vector<type> v(a, a + SIZE)
     • tạo vector vtừ SIZE phần tử đầu tiên của mảng a
vector Sequence Container
• Các hàm thành viên của vector
  – v.insert(iterator, value )
     • chèn value vào trước vị trí của iterator
  – v.insert(iterator, array , array + SIZE)
     • chèn vào vector SIZE phần tử đầu tiên của mảng array
  – v.erase( iterator )
     • xóa phần tử khỏi container
  – v.erase( iter1, iter2 )
     • xóa bỏ các phần tử bắt đầu từ iter1 đến hết phần tử
       liền trước iter2
vector Sequence Container
• Các hàm thành viên của vector
  – v.clear()
     • Xóa toàn bộ container
  – v.front(), v.back()
     • Trả về phần tử đầu tiên và cuối cùng
  – v.[elementNumber] = value;
     • Gán giá trị value cho một phần tử
  – v.at[elementNumber] = value;
     • Như trên, nhưng kèm theo kiểm tra chỉ số hợp lệ
     • có thể ném ngoại lệ out_of_bounds
vector Sequence Container
• ostream_iterator
  – std::ostream_iterator< type >
    Name( outputStream, separator );
     • type: outputs values of a certain type
     • outputStream: iterator output location
     • separator: character separating outputs
• Example
  – std::ostream_iterator< int > output( cout, " " );
  – std::copy( iterator1, iterator2, output );
     • Copies elements from iterator1 up to (not
       including) iterator2 to output, an
       ostream_iterator
                                                        20
1    // Fig. 21.14: fig21_14.cpp                                        21
2    // Demonstrating standard library vector class template.
3    #include <iostream>
4
5    using std::cout;
6    using std::cin;
7    using std::endl;
8
9    #include <vector>    // vector class-template definition
10
11   // prototype for function template printVector
12   template < class T >
13   void printVector( const std::vector< T > &integers2 );
14
15   int main()
16   {
17      const int SIZE = 6;           Tạo một vector      chứa
18      int array[ SIZE ] = { 1, 2, 3, 4, 5, 6 };
                                        các giá trị int
19
20      std::vector< int > integers;
21
                                              Gọi các hàm thành viên.
22      cout <<   "The initial size of integers is: "
23           <<   integers.size()
24           <<   "nThe initial capacity of integers is: "
25           <<   integers.capacity();
26
27   // function push_back   is in every sequence collection                   22
28   integers.push_back( 2   );                        sử dụng push_back để
29   integers.push_back( 3   );                        thêm phần tử vào cuối
30   integers.push_back( 4   );                        vector
31
32   cout << "nThe size of integers is: " << integers.size()
33        << "nThe capacity of integers is: "
34        << integers.capacity();
35
36   cout << "nnOutput array using pointer notation: ";
37
38   for ( int *ptr = array; ptr != array + SIZE; ++ptr )
39      cout << *ptr << ' ';
40
41   cout << "nOutput vector using iterator notation: ";
42   printVector( integers );
43
44   cout << "nReversed contents of vector integers: ";
45
23
46      std::vector< int >::reverse_iterator reverseIterator;
47
48      for ( reverseIterator = integers.rbegin();
49            reverseIterator!= integers.rend();                Duyệt ngược vector bằng
                                                                            fig21_14.cpp
50            ++reverseIterator )                                           (3 of 3)
                                                                một reverse_iterator.
51         cout << *reverseIterator << ' ';
52
53      cout << endl;
54
55      return 0;
56
57   } // end main                                           Template function để
58                                                           duyệt vector theo
59   // function template for outputting vector elements
60   template < class T >
                                                             chiều tiến.
61   void printVector( const std::vector< T > &integers2 )
62   {
63      std::vector< T >::const_iterator constIterator;
64
65      for ( constIterator = integers2.begin();
66            constIterator != integers2.end();
67            constIterator++ )
68         cout << *constIterator << ' ';
69
70   } // end function printVector
The   initial size of v is: 0                                               24
The   initial capacity of v is: 0
The   size of v is: 3
The   capacity of v is: 4
                                                          fig21_14.cpp
Contents of array a using pointer notation: 1 2 3 4 5 6   output (1 of 1)
Contents of vector v using iterator notation: 2 3 4
Reversed contents of vector v: 4 3 2
Container Adapter
• Container adapter
  – stack, queue và priority_queue
  – Không phải first class container, cho nên
     • Không hỗ trợ iterator
     • Không cung cấp cấu trúc dữ liệu
  – Lập trình viên có thể chọn cách cài đặt (sử dụng cấu
    trúc dữ liệu nào)
  – đều cung cấp các hàm thành viên push và pop bên
    cạnh các hàm thành viên khác.
stack Adapter
• stack
  – Header <stack>
  – chèn và xóa tại một đầu
  – Cấu trúc Last-in, first-out (LIFO)
  – Có thể chọn cài đặt bằng vector, list, hoặc deque (mặc
    định)
  – Khai báo
     stack<type, vector<type> > myStack;
     stack<type, list<type> > myOtherStack;
     stack<type> anotherStack; // default deque
  – chọn cài đặt là vector, list hay deque không làm thay đổi
    hành vi, chỉ ảnh hưởng tới hiệu quả (cài bằng deque và
    vector là nhanh nhất)
1    // Fig. 21.23: fig21_23.cpp                                                            27
2    // Standard library adapter stack test program.
3    #include <iostream>
4
5    using std::cout;                                                        fig21_23.cpp
6    using std::endl;                                                        (1 of 3)
7
8    #include <stack>    // stack adapter definition
9    #include <vector>   // vector class-template definition
10   #include <list>     // list class-template definition
11
12   // popElements function-template prototype
13   template< class T >
14   void popElements( T &stackRef );
15
16   int main()
17   {
                                                            Tạo stack bằng nhiều
18      // stack with default underlying deque              kiểu cài đặt.
19      std::stack< int > intDequeStack;
20
21      // stack with underlying vector
22      std::stack< int, std::vector< int > > intVectorStack;
23
24      // stack with underlying list
25      std::stack< int, std::list< int > > intListStack;
26
27     // push the values 0-9 onto each stack                                          28
28     for ( int i = 0; i < 10; ++i ) {
29        intDequeStack.push( i );
30        intVectorStack.push( i );
31        intListStack.push( i );               sử dụng hàm thành viên push.
                                                                        fig21_23.cpp
32                                                                       (2 of 3)
33     } // end for
34
35     // display and remove elements from each stack
36     cout << "Popping from intDequeStack: ";
37     popElements( intDequeStack );
38     cout << "nPopping from intVectorStack: ";
39     popElements( intVectorStack );
40     cout << "nPopping from intListStack: ";
41     popElements( intListStack );
42
43     cout << endl;
44
45     return 0;
46
47   } // end main
48
49   // pop elements from stack object to which stackRef refers                      29
50   template< class T >
51   void popElements( T &stackRef )
52   {
53      while ( !stackRef.empty() ) {                              fig21_23.cpp
54         cout << stackRef.top() << ' '; // view top element      (3 of 3)
55         stackRef.pop();                 // remove top element
56
                                                                   fig21_23.cpp
57      } // end while
                                                                   output (1 of 1)
58
59   } // end function popElements


 Popping from intDequeStack: 9 8 7 6 5 4 3 2 1 0
 Popping from intVectorStack: 9 8 7 6 5 4 3 2 1 0
 Popping from intListStack: 9 8 7 6 5 4 3 2 1 0
Các thuật toán
• Trước STL
  – các thư viện của các hãng khác nhau không
    tương thích
  – Các thuật toán được xây dựng và gắn vào trong
    các lớp container
• STL tách rời các container và các thuật toán
  – lợi thế:
     • dễ bổ sung các thuật toán mới
     • hiệu quả hơn, tránh các lời gọi hàm ảo
  – header <algorithm>
remove, remove_if, remove_copy và
          remove_copy_if
• remove
  – remove( iter1, iter2, value);
  – Bỏ mọi phần tử có giá trị value trong khoảng
    (iter1 - iter2) theo cách sau:
     • Chuyển các phần tử có giá trị value xuống cuối
     • không thay đổi kích thước của container hoặc thực
       sự xóa các phần tử
  – Trả về iterator tới kết thúc “mới” của container
  – các phần tử sau kết thúc mới là không xác định
remove, remove_if, remove_copy và
          remove_copy_if
• remove_copy
  – remove_copy(iter1, iter2, iter3, value);
     • trong khoảng iter1-iter2, chép các phần tử khác
       value vào iter3 (output iterator)
• remove_if
  – giống remove
     • trả về iterator tới phần tử cuối cùng
     • bỏ các phần tử mà hàm trả về true
  remove_if(iter1,iter2, function);
     • các phần tử được truyền cho function, hàm này
       trả về giá trị bool
remove, remove_if, remove_copy và
          remove_copy_if
• remove_copy_if
  – giống remove_copy và remove_if
    remove_copy_if(iter1, iter2, iter3, function);
Các thuật toán toán học
• random_shuffle(iter1, iter2)
  – xáo trộn các phần tử trong khoảng một cách ngẫu nhiên
• count(iter1, iter2, value)
  – trả về số lần xuất hiện của value trong khoảng
• count_if(iter1, iter2, function)
  – đếm số phần tử làm function trả về true
• min_element(iter1, iter2)
  – trả về iterator tới phần tử nhỏ nhất
• max_element(iter1, iter2)
  – trả về iterator tới phần tử lớn nhất
Các thuật toán toán học
• accumulate(iter1, iter2)
  – trả về tổng các phần tử trong khoảng
• for_each(iter1, iter2, function)
  – Gọi hàm function cho mỗi phần tử trong khoảng
  – không sửa đổi phần tử
• transform(iter1, iter2, iter3, function)
  – gọi function cho mọi phần tử trong khoảng iter1-
    iter2, kết quả ghi vào iter3
Các thuật toán tìm kiếm
        và sắp xếp cơ bản
• find(iter1, iter2, value)
   – trả về iterator tới lần xuất hiện đầu tiên (trong
     khoảng) của value
• find_if(iter1, iter2, function)
   – như find
   – trả về iterator khi function trả về true
• sort(iter1, iter2)
   – sắp xếp các phần tử theo thứ tự tăng dần
• binary_search(iter1, iter2, value)
1    // Fig. 21.31: fig21_31.cpp                                                 37
2    // Standard library search and sort algorithms.
3    #include <iostream>
4
5    using std::cout;                                             fig21_31.cpp
6    using std::endl;                                             (1 of 4)
7
8    #include <algorithm>   // algorithm definitions
9    #include <vector>      // vector class-template definition
10
11   bool greater10( int value );   // prototype
12
13   int main()
14   {
15      const int SIZE = 10;
16      int a[ SIZE ] = { 10, 2, 17, 5, 16, 8, 13, 11, 20, 7 };
17
18      std::vector< int > v( a, a + SIZE );
19      std::ostream_iterator< int > output( cout, " " );
20
21      cout << "Vector v contains: ";
22      std::copy( v.begin(), v.end(), output );
23
24      // locate first occurrence of 16 in v
25      std::vector< int >::iterator location;
26      location = std::find( v.begin(), v.end(), 16 );
27                                                                              38
28   if ( location != v.end() )
29      cout << "nnFound 16 at location "
30           << ( location - v.begin() );
31   else                                                        fig21_31.cpp
32      cout << "nn16 not found";                              (2 of 4)
33
34   // locate first occurrence of 100 in v
35   location = std::find( v.begin(), v.end(), 100 );
36
37   if ( location != v.end() )
38      cout << "nFound 100 at location "
39           << ( location - v.begin() );
40   else
41      cout << "n100 not found";
42
43   // locate first occurrence of value greater than 10 in v
44   location = std::find_if( v.begin(), v.end(), greater10 );
45
46   if ( location != v.end() )
47      cout << "nnThe first value greater than 10 is "
48           << *location << "nfound at location "
49           << ( location - v.begin() );
50   else
51      cout << "nnNo values greater than 10 were found";
52
39
53     // sort elements of v
54     std::sort( v.begin(), v.end() );
55
56      cout << "nnVector v after sort: ";                  fig21_31.cpp
57      std::copy( v.begin(), v.end(), output );              (3 of 4)
58
59     // use binary_search to locate 13 in v
60     if ( std::binary_search( v.begin(), v.end(), 13 ) )
61        cout << "nn13 was found in v";
62     else
63        cout << "nn13 was not found in v";
64
65     // use binary_search to locate 100 in v
66     if ( std::binary_search( v.begin(), v.end(), 100 ) )
67        cout << "n100 was found in v";
68     else
69        cout << "n100 was not found in v";
70
71      cout << endl;
72
73     return 0;
74
75   } // end main
76
77   // determine whether argument is greater than 10                     40
78   bool greater10( int value )
79   {
80      return value > 10;
81                                                      fig21_31.cpp
82   } // end function greater10                        (4 of 4)

 Vector v contains: 10 2 17 5 16 8 13 11 20 7           fig21_31.cpp
                                                        output (1 of 1)
 Found 16 at location 4
 100 not found
  
 The first value greater than 10 is 17
 found at location 2
  
 Vector v after sort: 2 5 7 8 10 11 13 16 17 20
  
 13 was found in v
 100 was not found in v
Function Object – functor

• (<functional>)
     – Các đối tượng có thể gọi như hàm bằng toán tử ()
  




             STL function objects   Type
             divides< T >           arithmetic 
             equal_to< T >          relational 
             greater< T >           relational 
             greater_equal< T >     relational 
             less< T >              relational 
             less_equal< T >        relational 
             logical_and< T >       logical 
             logical_not< T >       logical 
             logical_or< T >        logical 
             minus< T >             arithmetic 
             modulus< T >           arithmetic 
             negate< T >            arithmetic 
             not_equal_to< T >      relational 
             plus< T >              arithmetic 
             multiplies< T >        arithmetic 
1    // Fig. 21.42: fig21_42.cpp
2    // Demonstrating function objects.
3    #include <iostream>
4
5    using std::cout;
6    using std::endl;                                                      fig21_42.cpp
7                                                                          (1 of 4)
8    #include   <vector>       //   vector class-template definition
9    #include   <algorithm>    //   copy algorithm
10   #include   <numeric>      //   accumulate algorithm
11   #include   <functional>   //   binary_function definition
12
13   // binary function adds square of its second argument and Tạo một hàm để dùng
14   // running total in its first argument, then returns sum với accumulate.
15   int sumSquares( int total, int value )
16   {
17      return total + value * value;
18
19   } // end function sumSquares
20




                                                                                          42
21   // binary function class template defines overloaded operator()
22   // that adds suare of its second argument and running total in
23   // its first argument, then returns sum
24   template< class T >
25   class SumSquaresClass : public std::binary_function< T, T, T > {
26                                                                           fig21_42.cpp
27   public:                                                    Tạo một function object
                                                                             (2 of 4)
28
                                                                (nó còn có thể đóng gói
29      // add square of value to total and return result
30      const T operator()( const T &total, const T &value )    dữ liệu).
31      {                                                       Overload operator().
32         return total + value * value;
33
34      } // end function operator()
35
36   }; // end class SumSquaresClass
37




                                                                                            43
38   int main()
39   {
40      const int SIZE = 10;
41      int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
42
43      std::vector< int > integers( array, array + SIZE );                   fig21_42.cpp
44                                                                            (3 of 4)
45      std::ostream_iterator< int > output( cout, " " );
46
47      int result = 0;
48
49      cout << "vector v contains:n";                               đầu tiên, accumulate
50      std::copy( integers.begin(), integers.end(), output );        truyền 0 và phần tử
51
                                                                      thứ nhất lần lượt làm
52      // calculate sum of squares of elements of vector integers
53      // using binary function sumSquares                           các tham số. Sau đó, nó
54      result = std::accumulate( integers.begin(), integers.end(),   dùng kếtquả trả về làm
55         0, sumSquares );                                           tham số thứ nhất, và lặp
56
                                                                      qua các phần tử còn lại.
57      cout << "nnSum of squares of elements in integers using "
58           << "binarynfunction sumSquares: " << result;
59




                                                                                                 44
60     // calculate sum of squares of elements of vector integers
61     // using binary-function object
62     result = std::accumulate( integers.begin(), integers.end(),
63        0, SumSquaresClass< int >() );
64                                                                   fig21_42.cpp
65     cout << "nnSum of squares of elements in integers using "   (4 of 4)
66          << "binarynfunction object of type "
67          << "SumSquaresClass< int >: " << result << endl;
                                                                     fig21_42.cpp
68
                                                                     output (1 of 1)
69     return 0;
70                                        dùng accumulate với
71   } // end main                        một function object.

 vector v contains:
 1 2 3 4 5 6 7 8 9 10
  
 Sum of squares of elements in integers using binary
 function sumSquares: 385
  
 Sum of squares of elements in integers using binary
 function object of type SumSquaresClass< int >: 385




                                                                                       45

Weitere ähnliche Inhalte

Was ist angesagt?

Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Vu Tuan
 
Lap trinh java hieu qua
Lap trinh java hieu quaLap trinh java hieu qua
Lap trinh java hieu quaLê Anh
 
Oop unit 12 đồ họa và xử lý sự kiện
Oop unit 12 đồ họa và xử lý sự kiệnOop unit 12 đồ họa và xử lý sự kiện
Oop unit 12 đồ họa và xử lý sự kiệnTráng Hà Viết
 
Threads - Lập trình hệ thống IT4786
Threads - Lập trình hệ thống IT4786Threads - Lập trình hệ thống IT4786
Threads - Lập trình hệ thống IT4786Đông Nguyễn Văn
 
02 chuong 2 - lay du lieu theo cach connected
02   chuong 2 - lay du lieu theo cach connected02   chuong 2 - lay du lieu theo cach connected
02 chuong 2 - lay du lieu theo cach connectedtruong le hung
 
02 chuong2-laydulieutheocachconnected-140404114611-phpapp02
02 chuong2-laydulieutheocachconnected-140404114611-phpapp0202 chuong2-laydulieutheocachconnected-140404114611-phpapp02
02 chuong2-laydulieutheocachconnected-140404114611-phpapp02huynhtrong774129
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileNhuận Lê Văn
 
bai giang Matlab
bai giang Matlabbai giang Matlab
bai giang Matlableoteo113
 
Bai04 tao vasudungdoituong
Bai04 tao vasudungdoituongBai04 tao vasudungdoituong
Bai04 tao vasudungdoituongNhuận Lê Văn
 
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433Muoivy Wm
 
175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]
175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]
175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]Vinh Phan
 
Tailieu.vncty.com 06 matlab-osadq3_j2qu_20130412090644_577
Tailieu.vncty.com   06 matlab-osadq3_j2qu_20130412090644_577Tailieu.vncty.com   06 matlab-osadq3_j2qu_20130412090644_577
Tailieu.vncty.com 06 matlab-osadq3_j2qu_20130412090644_577Trần Đức Anh
 
Oop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátOop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátTráng Hà Viết
 
Tính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn MatlabTính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn MatlabChien Dang
 
Tài liệu Matlab kỹ thuật
Tài liệu Matlab kỹ thuậtTài liệu Matlab kỹ thuật
Tài liệu Matlab kỹ thuậtPham Hoang
 
Bài 2: Biến và toán tử - Giáo trình FPT
Bài 2: Biến và toán tử - Giáo trình FPTBài 2: Biến và toán tử - Giáo trình FPT
Bài 2: Biến và toán tử - Giáo trình FPTMasterCode.vn
 
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPTBài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPTMasterCode.vn
 

Was ist angesagt? (20)

Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731
 
Co ban ve_matlab
Co ban ve_matlabCo ban ve_matlab
Co ban ve_matlab
 
Lap trinh java hieu qua
Lap trinh java hieu quaLap trinh java hieu qua
Lap trinh java hieu qua
 
Oop unit 12 đồ họa và xử lý sự kiện
Oop unit 12 đồ họa và xử lý sự kiệnOop unit 12 đồ họa và xử lý sự kiện
Oop unit 12 đồ họa và xử lý sự kiện
 
Threads - Lập trình hệ thống IT4786
Threads - Lập trình hệ thống IT4786Threads - Lập trình hệ thống IT4786
Threads - Lập trình hệ thống IT4786
 
02 chuong 2 - lay du lieu theo cach connected
02   chuong 2 - lay du lieu theo cach connected02   chuong 2 - lay du lieu theo cach connected
02 chuong 2 - lay du lieu theo cach connected
 
02 chuong2-laydulieutheocachconnected-140404114611-phpapp02
02 chuong2-laydulieutheocachconnected-140404114611-phpapp0202 chuong2-laydulieutheocachconnected-140404114611-phpapp02
02 chuong2-laydulieutheocachconnected-140404114611-phpapp02
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaile
 
bai giang Matlab
bai giang Matlabbai giang Matlab
bai giang Matlab
 
Bai04 tao vasudungdoituong
Bai04 tao vasudungdoituongBai04 tao vasudungdoituong
Bai04 tao vasudungdoituong
 
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
 
175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]
175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]
175 thuc-hanh-matlab-[dh-khoa-hoc-tu-nhien-hcm]
 
Bai08 lap trinhtongquat
Bai08 lap trinhtongquatBai08 lap trinhtongquat
Bai08 lap trinhtongquat
 
Tailieu.vncty.com 06 matlab-osadq3_j2qu_20130412090644_577
Tailieu.vncty.com   06 matlab-osadq3_j2qu_20130412090644_577Tailieu.vncty.com   06 matlab-osadq3_j2qu_20130412090644_577
Tailieu.vncty.com 06 matlab-osadq3_j2qu_20130412090644_577
 
Huong danthuchanhmang
Huong danthuchanhmangHuong danthuchanhmang
Huong danthuchanhmang
 
Oop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátOop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quát
 
Tính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn MatlabTính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn Matlab
 
Tài liệu Matlab kỹ thuật
Tài liệu Matlab kỹ thuậtTài liệu Matlab kỹ thuật
Tài liệu Matlab kỹ thuật
 
Bài 2: Biến và toán tử - Giáo trình FPT
Bài 2: Biến và toán tử - Giáo trình FPTBài 2: Biến và toán tử - Giáo trình FPT
Bài 2: Biến và toán tử - Giáo trình FPT
 
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPTBài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
 

Andere mochten auch

Delegate và event trong C#
Delegate và event trong C#Delegate và event trong C#
Delegate và event trong C#jvinhit
 
Tang tốc usb cho windows7
Tang tốc usb cho windows7Tang tốc usb cho windows7
Tang tốc usb cho windows7nhatthai1969
 
Tìm hiểu keylogger và thiết kế chương trình keylogger
Tìm hiểu keylogger và thiết kế chương trình keyloggerTìm hiểu keylogger và thiết kế chương trình keylogger
Tìm hiểu keylogger và thiết kế chương trình keyloggerVũ Mạnh Sơn
 
Ky thuat lap trinh c++
Ky thuat lap trinh c++Ky thuat lap trinh c++
Ky thuat lap trinh c++ptquang160492
 
Giáo trình Microsoft Powerpoint 2007
Giáo trình Microsoft Powerpoint 2007Giáo trình Microsoft Powerpoint 2007
Giáo trình Microsoft Powerpoint 2007Huynh Bao Thien
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtMôi Trường Việt
 

Andere mochten auch (8)

Chapter01 intro
Chapter01 introChapter01 intro
Chapter01 intro
 
Delegate và event trong C#
Delegate và event trong C#Delegate và event trong C#
Delegate và event trong C#
 
Tang tốc usb cho windows7
Tang tốc usb cho windows7Tang tốc usb cho windows7
Tang tốc usb cho windows7
 
Tìm hiểu keylogger và thiết kế chương trình keylogger
Tìm hiểu keylogger và thiết kế chương trình keyloggerTìm hiểu keylogger và thiết kế chương trình keylogger
Tìm hiểu keylogger và thiết kế chương trình keylogger
 
User Control
User ControlUser Control
User Control
 
Ky thuat lap trinh c++
Ky thuat lap trinh c++Ky thuat lap trinh c++
Ky thuat lap trinh c++
 
Giáo trình Microsoft Powerpoint 2007
Giáo trình Microsoft Powerpoint 2007Giáo trình Microsoft Powerpoint 2007
Giáo trình Microsoft Powerpoint 2007
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
 

Ähnlich wie 7 stl c++

OOP_02_Java can ban.pdf
OOP_02_Java can ban.pdfOOP_02_Java can ban.pdf
OOP_02_Java can ban.pdfssuserd01a5c
 
Bai thi Nghiem ky thuat dien tu
Bai thi Nghiem ky thuat dien tuBai thi Nghiem ky thuat dien tu
Bai thi Nghiem ky thuat dien tuBrand Xanh
 
Ky thuat l.trinh_java
Ky thuat l.trinh_javaKy thuat l.trinh_java
Ky thuat l.trinh_javaLam Man
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Python Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterationsPython Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterationsKhánh Nguyễn
 
Oop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng caoOop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng caoTráng Hà Viết
 
Oop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớpOop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớpTráng Hà Viết
 
Lớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảngLớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảngHoàng Kỳ Anh
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcmHong Phuoc Nguyen
 
Bai5 dsachlket
Bai5 dsachlketBai5 dsachlket
Bai5 dsachlketHồ Lợi
 
LTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.pptLTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.pptssuserf603dc1
 

Ähnlich wie 7 stl c++ (20)

D05 stl
D05 stlD05 stl
D05 stl
 
OOP_02_Java can ban.pdf
OOP_02_Java can ban.pdfOOP_02_Java can ban.pdf
OOP_02_Java can ban.pdf
 
[Cntt] all java
[Cntt] all java[Cntt] all java
[Cntt] all java
 
Chuong 05
Chuong 05Chuong 05
Chuong 05
 
Bai thi Nghiem ky thuat dien tu
Bai thi Nghiem ky thuat dien tuBai thi Nghiem ky thuat dien tu
Bai thi Nghiem ky thuat dien tu
 
C đến C++ phần 1
C đến C++ phần 1C đến C++ phần 1
C đến C++ phần 1
 
Chuong 05 mang, con tro, tham chieu
Chuong 05 mang, con tro, tham chieuChuong 05 mang, con tro, tham chieu
Chuong 05 mang, con tro, tham chieu
 
Ky thuat l.trinh_java
Ky thuat l.trinh_javaKy thuat l.trinh_java
Ky thuat l.trinh_java
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
Python Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterationsPython Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterations
 
Oop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng caoOop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng cao
 
Oop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớpOop unit 04 các kỹ thuật xây dựng lớp
Oop unit 04 các kỹ thuật xây dựng lớp
 
Lớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảngLớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảng
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcm
 
Bai5 dsachlket
Bai5 dsachlketBai5 dsachlket
Bai5 dsachlket
 
LTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.pptLTJAVA_TV_Slides.ppt
LTJAVA_TV_Slides.ppt
 
String c++
String c++String c++
String c++
 
Hàm can bản
Hàm can bảnHàm can bản
Hàm can bản
 
344444
344444344444
344444
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 

7 stl c++

  • 1. Thư viện chuẩn C++ Standard Template Library (STL)
  • 2. Thư viện khuôn mẫu chuẩn - STL • Thư viện chuẩn C++ bao gồm 32 header file <algorithm> <ios> <map> <stack> <bitset> <iosfwd> <memory> <stdexcept> <complex> <iostream> <new> <streambuf> <deque> <istream> <numeric> <string> <exception> <iterator> <ostream> <typeinfo> <fstream> <limits> <queue> <utility> <functional> <list> <set> <valarray> <iomanip> <locale> <sstream> <vector>
  • 3. Thư viện khuôn mẫu chuẩn - STL • Thư viện chuẩn C++ gồm 2 phần: – Lớp string – Thư viện khuôn mẫu chuẩn – STL • Ngoại trừ lớp string, tất cả các thành phần còn lại của thư viện đều là các khuôn mẫu • Tác giả đầu tiên của STL là Alexander Stepanov, mục đích của ông là xây dựng một cách thể hiện tư tưởng lập trình tổng quát
  • 4. Thư viện khuôn mẫu chuẩn - STL • Các khái niệm trong STL được phát triển độc lập với C++ – Do đó, ban đầu, STL không phải là một thư viện C++, mà nó đã được chuyển đổi thành thư viện C++ – Nhiều tư tưởng dẫn đến sự phát triển của STL đã được cài đặt phần nào trong Scheme, Ada, và C
  • 5. Thư viện khuôn mẫu chuẩn - STL • Một số lời khuyên về STL – STL được thiết kế đẹp và hiệu quả - không có thừa kế hay hàm ảo trong bất kỳ định nghĩa nào – Từ tư tưởng lập trình tổng quát dẫn tới những "khối cơ bản" (building block) mà có thể kết hợp với nhau theo đủ kiểu – Tuy làm quen với STL tốn không ít thời gian nhưng thành quả tiềm tàng về năng xuất rất xứng đáng với thời gian đầu tư – Tóm lại – hãy học và hãy sử dụng! • Bài giảng này chỉ để giới thiệu một phần rất nhỏ của STL
  • 6. Giới thiệu STL • Ba thành phần chính của STL – Các thành phần rất mạnh xây dựng dựa trên template • Container: các cấu trúc dữ liệu template • Iterator: giống con trỏ, dùng để truy nhập các phần tử dữ liệu của các container • Algorithm: các thuật toán để thao tác dữ liệu, tìm kiếm, sắp xếp, v.v..
  • 7. Giới thiệu về các Container • 3 loại container – Sequence container – container chuỗi • các cấu trúc dữ liệu tuyến tính (vector, danh sách liên kết) • first-class container • vector, deque, list – Associative container – container liên kết • các cấu trúc phi tuyến, có thể tìm phần tử nhanh chóng • first-class container • các cặp khóa/giá trị • set, multiset, map, multimap – Container adapter – các bộ tương thích container • stack, queue, priority_queue
  • 8. Các hàm thành viên STL • Các hàm thành viên mọi container đều có – Default constructor, copy constructor, destructor – empty – max_size, size – = < <= > >= == != – swap • Các hàm thành viên của first-class container – begin, end – rbegin, rend – erase, clear
  • 9. Giới thiệu về Iterator • Iterator tương tự như con trỏ – trỏ tới các phần tử trong một container – các toán tử iterator cho mọi container • * truy nhập phần tử được trỏ tới • ++ trỏ tới phần tử tiếp theo • begin() trả về iterator trỏ tới phần tử đầu tiên • end() trả về iterator trỏ tới phần tử đặc biệt chặn cuối container
  • 10. Các loại Iterator • Input (ví dụ: istream_iterator) – Đọc các phần tử từ một container, hỗ trợ ++,+= (chỉ tiến) • Output (ví dụ: ostream_iterator) – Ghi các phần tử vào container, hỗ trợ ++,+= (chỉ tiến) • Forward (ví dụ: hash_set<T> iterator) – Kết hợp input iterator và output iterator – Multi-pass (có thể duyệt chuỗi nhiều lần) • Bidirectional (Ví dụ: list<T> iterator) – Như forward iterator, nhưng có thể lùi (--,-=) • Randomaccess (Ví dụ: vector<T> iterator) – Như bidirectional, nhưng còn có thể nhảy tới phần tử tùy ý
  • 11. Các loại Iterator được hỗ trợ • Sequence container – vector: random access – deque: random access – list: bidirectional • Associative container (hỗ trợ các loại bidirectional) – set, multiset,map, multimap • Container adapter (không hỗ trợ iterator) – stack, queue, priority_queue
  • 12. Các phép toán đối với Iterator • Input iterator – ++ , =*p , -> , == , != • Output iterator – ++ , *p= , p = p1 • Forward iterator – Kết hợp các toán tử của input và output iterator • Bidirectional iterator – các toán tử cho forward, và -- • Random iterator – các toán tử cho bidirectional, và + , +=, -, -=, >, >=, <, <=,[]
  • 13. Giới thiệu các thuật toán – Algorithm • STL có các thuật toán được sử dụng tổng quát cho nhiều loại container – thao tác gián tiếp với các phần tử qua các iterator – thường dùng cho các phần tử trong một chuỗi • chuỗi xác định bởi một cặp iterator trỏ tới phần tử đầu tiên và cuối cùng của chuỗi – các thuật toán thường trả về iterator • ví dụ: find() trả về iterator trỏ tới phần tử cần tìm hoặc trả về end() nếu không tìm thấy – sử dụng các thuật toán được cung cấp giúp lập trình viên tiết kiệm thời gian và công sức
  • 14. Sequence Container • 3 loại sequence container: – vector – dựa theo mảng – deque – dựa theo mảng – list – danh sách liên kết hiệu quả cao
  • 15. vector Sequence Container • vector – <vector> – cấu trúc dữ liệu với các vùng nhớ liên tiếp • truy nhập các phần tử bằng toán tử [ ] – sử dụng khi dữ liệu cần được sắp xếp và truy nhập dễ dàng • Cơchế hoạt động khi hết bộ nhớ – cấp phát một vùng nhớ liên lục lớn hơn – tự sao chép ra vùng nhớ mới – trả lại vùng nhớ cũ • sử dụng randomaccess iterator
  • 16. vector Sequence Container • Khai báo – std::vector <type> v; • type là kiểu dữ liệu của phần tử dữ liệu (int, float, v.v..) • Iterator – std::vector<type>::iterator iterVar; • trường hợp thông thường – std::vector<type>::const_iterator iterVar; • const_iterator không thể sửa đổi các phần tử – std::vector<type>::reverse_iterator iterVar; • Visits elements in reverse order (end to beginning) • Use rbegin to get starting point • Use rend to get ending point
  • 17. vector Sequence Container • Các hàm thành viên của vector – v.push_back(value) • thêm phần tử vào cuối (sequence container nào cũng có hàm này). – v.size() • kích thước hiện tại của vector – v.capacity() • kích thước có thể lưu trữ trước khi phải cấp phát lại • khi cấp phát lại sẽ cấp phát kích thước gấp đôi – vector<type> v(a, a + SIZE) • tạo vector vtừ SIZE phần tử đầu tiên của mảng a
  • 18. vector Sequence Container • Các hàm thành viên của vector – v.insert(iterator, value ) • chèn value vào trước vị trí của iterator – v.insert(iterator, array , array + SIZE) • chèn vào vector SIZE phần tử đầu tiên của mảng array – v.erase( iterator ) • xóa phần tử khỏi container – v.erase( iter1, iter2 ) • xóa bỏ các phần tử bắt đầu từ iter1 đến hết phần tử liền trước iter2
  • 19. vector Sequence Container • Các hàm thành viên của vector – v.clear() • Xóa toàn bộ container – v.front(), v.back() • Trả về phần tử đầu tiên và cuối cùng – v.[elementNumber] = value; • Gán giá trị value cho một phần tử – v.at[elementNumber] = value; • Như trên, nhưng kèm theo kiểm tra chỉ số hợp lệ • có thể ném ngoại lệ out_of_bounds
  • 20. vector Sequence Container • ostream_iterator – std::ostream_iterator< type > Name( outputStream, separator ); • type: outputs values of a certain type • outputStream: iterator output location • separator: character separating outputs • Example – std::ostream_iterator< int > output( cout, " " ); – std::copy( iterator1, iterator2, output ); • Copies elements from iterator1 up to (not including) iterator2 to output, an ostream_iterator 20
  • 21. 1 // Fig. 21.14: fig21_14.cpp 21 2 // Demonstrating standard library vector class template. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include <vector> // vector class-template definition 10 11 // prototype for function template printVector 12 template < class T > 13 void printVector( const std::vector< T > &integers2 ); 14 15 int main() 16 { 17 const int SIZE = 6; Tạo một vector chứa 18 int array[ SIZE ] = { 1, 2, 3, 4, 5, 6 }; các giá trị int 19 20 std::vector< int > integers; 21 Gọi các hàm thành viên. 22 cout << "The initial size of integers is: " 23 << integers.size() 24 << "nThe initial capacity of integers is: " 25 << integers.capacity(); 26
  • 22. 27 // function push_back is in every sequence collection 22 28 integers.push_back( 2 ); sử dụng push_back để 29 integers.push_back( 3 ); thêm phần tử vào cuối 30 integers.push_back( 4 ); vector 31 32 cout << "nThe size of integers is: " << integers.size() 33 << "nThe capacity of integers is: " 34 << integers.capacity(); 35 36 cout << "nnOutput array using pointer notation: "; 37 38 for ( int *ptr = array; ptr != array + SIZE; ++ptr ) 39 cout << *ptr << ' '; 40 41 cout << "nOutput vector using iterator notation: "; 42 printVector( integers ); 43 44 cout << "nReversed contents of vector integers: "; 45
  • 23. 23 46 std::vector< int >::reverse_iterator reverseIterator; 47 48 for ( reverseIterator = integers.rbegin(); 49 reverseIterator!= integers.rend(); Duyệt ngược vector bằng fig21_14.cpp 50 ++reverseIterator ) (3 of 3) một reverse_iterator. 51 cout << *reverseIterator << ' '; 52 53 cout << endl; 54 55 return 0; 56 57 } // end main Template function để 58 duyệt vector theo 59 // function template for outputting vector elements 60 template < class T > chiều tiến. 61 void printVector( const std::vector< T > &integers2 ) 62 { 63 std::vector< T >::const_iterator constIterator; 64 65 for ( constIterator = integers2.begin(); 66 constIterator != integers2.end(); 67 constIterator++ ) 68 cout << *constIterator << ' '; 69 70 } // end function printVector
  • 24. The initial size of v is: 0 24 The initial capacity of v is: 0 The size of v is: 3 The capacity of v is: 4 fig21_14.cpp Contents of array a using pointer notation: 1 2 3 4 5 6 output (1 of 1) Contents of vector v using iterator notation: 2 3 4 Reversed contents of vector v: 4 3 2
  • 25. Container Adapter • Container adapter – stack, queue và priority_queue – Không phải first class container, cho nên • Không hỗ trợ iterator • Không cung cấp cấu trúc dữ liệu – Lập trình viên có thể chọn cách cài đặt (sử dụng cấu trúc dữ liệu nào) – đều cung cấp các hàm thành viên push và pop bên cạnh các hàm thành viên khác.
  • 26. stack Adapter • stack – Header <stack> – chèn và xóa tại một đầu – Cấu trúc Last-in, first-out (LIFO) – Có thể chọn cài đặt bằng vector, list, hoặc deque (mặc định) – Khai báo stack<type, vector<type> > myStack; stack<type, list<type> > myOtherStack; stack<type> anotherStack; // default deque – chọn cài đặt là vector, list hay deque không làm thay đổi hành vi, chỉ ảnh hưởng tới hiệu quả (cài bằng deque và vector là nhanh nhất)
  • 27. 1 // Fig. 21.23: fig21_23.cpp 27 2 // Standard library adapter stack test program. 3 #include <iostream> 4 5 using std::cout; fig21_23.cpp 6 using std::endl; (1 of 3) 7 8 #include <stack> // stack adapter definition 9 #include <vector> // vector class-template definition 10 #include <list> // list class-template definition 11 12 // popElements function-template prototype 13 template< class T > 14 void popElements( T &stackRef ); 15 16 int main() 17 { Tạo stack bằng nhiều 18 // stack with default underlying deque kiểu cài đặt. 19 std::stack< int > intDequeStack; 20 21 // stack with underlying vector 22 std::stack< int, std::vector< int > > intVectorStack; 23 24 // stack with underlying list 25 std::stack< int, std::list< int > > intListStack; 26
  • 28. 27 // push the values 0-9 onto each stack 28 28 for ( int i = 0; i < 10; ++i ) { 29 intDequeStack.push( i ); 30 intVectorStack.push( i ); 31 intListStack.push( i ); sử dụng hàm thành viên push. fig21_23.cpp 32 (2 of 3) 33 } // end for 34 35 // display and remove elements from each stack 36 cout << "Popping from intDequeStack: "; 37 popElements( intDequeStack ); 38 cout << "nPopping from intVectorStack: "; 39 popElements( intVectorStack ); 40 cout << "nPopping from intListStack: "; 41 popElements( intListStack ); 42 43 cout << endl; 44 45 return 0; 46 47 } // end main 48
  • 29. 49 // pop elements from stack object to which stackRef refers 29 50 template< class T > 51 void popElements( T &stackRef ) 52 { 53 while ( !stackRef.empty() ) { fig21_23.cpp 54 cout << stackRef.top() << ' '; // view top element (3 of 3) 55 stackRef.pop(); // remove top element 56 fig21_23.cpp 57 } // end while output (1 of 1) 58 59 } // end function popElements Popping from intDequeStack: 9 8 7 6 5 4 3 2 1 0 Popping from intVectorStack: 9 8 7 6 5 4 3 2 1 0 Popping from intListStack: 9 8 7 6 5 4 3 2 1 0
  • 30. Các thuật toán • Trước STL – các thư viện của các hãng khác nhau không tương thích – Các thuật toán được xây dựng và gắn vào trong các lớp container • STL tách rời các container và các thuật toán – lợi thế: • dễ bổ sung các thuật toán mới • hiệu quả hơn, tránh các lời gọi hàm ảo – header <algorithm>
  • 31. remove, remove_if, remove_copy và remove_copy_if • remove – remove( iter1, iter2, value); – Bỏ mọi phần tử có giá trị value trong khoảng (iter1 - iter2) theo cách sau: • Chuyển các phần tử có giá trị value xuống cuối • không thay đổi kích thước của container hoặc thực sự xóa các phần tử – Trả về iterator tới kết thúc “mới” của container – các phần tử sau kết thúc mới là không xác định
  • 32. remove, remove_if, remove_copy và remove_copy_if • remove_copy – remove_copy(iter1, iter2, iter3, value); • trong khoảng iter1-iter2, chép các phần tử khác value vào iter3 (output iterator) • remove_if – giống remove • trả về iterator tới phần tử cuối cùng • bỏ các phần tử mà hàm trả về true remove_if(iter1,iter2, function); • các phần tử được truyền cho function, hàm này trả về giá trị bool
  • 33. remove, remove_if, remove_copy và remove_copy_if • remove_copy_if – giống remove_copy và remove_if remove_copy_if(iter1, iter2, iter3, function);
  • 34. Các thuật toán toán học • random_shuffle(iter1, iter2) – xáo trộn các phần tử trong khoảng một cách ngẫu nhiên • count(iter1, iter2, value) – trả về số lần xuất hiện của value trong khoảng • count_if(iter1, iter2, function) – đếm số phần tử làm function trả về true • min_element(iter1, iter2) – trả về iterator tới phần tử nhỏ nhất • max_element(iter1, iter2) – trả về iterator tới phần tử lớn nhất
  • 35. Các thuật toán toán học • accumulate(iter1, iter2) – trả về tổng các phần tử trong khoảng • for_each(iter1, iter2, function) – Gọi hàm function cho mỗi phần tử trong khoảng – không sửa đổi phần tử • transform(iter1, iter2, iter3, function) – gọi function cho mọi phần tử trong khoảng iter1- iter2, kết quả ghi vào iter3
  • 36. Các thuật toán tìm kiếm và sắp xếp cơ bản • find(iter1, iter2, value) – trả về iterator tới lần xuất hiện đầu tiên (trong khoảng) của value • find_if(iter1, iter2, function) – như find – trả về iterator khi function trả về true • sort(iter1, iter2) – sắp xếp các phần tử theo thứ tự tăng dần • binary_search(iter1, iter2, value)
  • 37. 1 // Fig. 21.31: fig21_31.cpp 37 2 // Standard library search and sort algorithms. 3 #include <iostream> 4 5 using std::cout; fig21_31.cpp 6 using std::endl; (1 of 4) 7 8 #include <algorithm> // algorithm definitions 9 #include <vector> // vector class-template definition 10 11 bool greater10( int value ); // prototype 12 13 int main() 14 { 15 const int SIZE = 10; 16 int a[ SIZE ] = { 10, 2, 17, 5, 16, 8, 13, 11, 20, 7 }; 17 18 std::vector< int > v( a, a + SIZE ); 19 std::ostream_iterator< int > output( cout, " " ); 20 21 cout << "Vector v contains: "; 22 std::copy( v.begin(), v.end(), output ); 23 24 // locate first occurrence of 16 in v 25 std::vector< int >::iterator location; 26 location = std::find( v.begin(), v.end(), 16 );
  • 38. 27 38 28 if ( location != v.end() ) 29 cout << "nnFound 16 at location " 30 << ( location - v.begin() ); 31 else fig21_31.cpp 32 cout << "nn16 not found"; (2 of 4) 33 34 // locate first occurrence of 100 in v 35 location = std::find( v.begin(), v.end(), 100 ); 36 37 if ( location != v.end() ) 38 cout << "nFound 100 at location " 39 << ( location - v.begin() ); 40 else 41 cout << "n100 not found"; 42 43 // locate first occurrence of value greater than 10 in v 44 location = std::find_if( v.begin(), v.end(), greater10 ); 45 46 if ( location != v.end() ) 47 cout << "nnThe first value greater than 10 is " 48 << *location << "nfound at location " 49 << ( location - v.begin() ); 50 else 51 cout << "nnNo values greater than 10 were found"; 52
  • 39. 39 53 // sort elements of v 54 std::sort( v.begin(), v.end() ); 55 56 cout << "nnVector v after sort: "; fig21_31.cpp 57 std::copy( v.begin(), v.end(), output ); (3 of 4) 58 59 // use binary_search to locate 13 in v 60 if ( std::binary_search( v.begin(), v.end(), 13 ) ) 61 cout << "nn13 was found in v"; 62 else 63 cout << "nn13 was not found in v"; 64 65 // use binary_search to locate 100 in v 66 if ( std::binary_search( v.begin(), v.end(), 100 ) ) 67 cout << "n100 was found in v"; 68 else 69 cout << "n100 was not found in v"; 70 71 cout << endl; 72 73 return 0; 74 75 } // end main 76
  • 40. 77 // determine whether argument is greater than 10 40 78 bool greater10( int value ) 79 { 80 return value > 10; 81 fig21_31.cpp 82 } // end function greater10 (4 of 4) Vector v contains: 10 2 17 5 16 8 13 11 20 7 fig21_31.cpp   output (1 of 1) Found 16 at location 4 100 not found   The first value greater than 10 is 17 found at location 2   Vector v after sort: 2 5 7 8 10 11 13 16 17 20   13 was found in v 100 was not found in v
  • 41. Function Object – functor • (<functional>) – Các đối tượng có thể gọi như hàm bằng toán tử ()   STL function objects Type divides< T > arithmetic  equal_to< T > relational  greater< T > relational  greater_equal< T > relational  less< T > relational  less_equal< T > relational  logical_and< T > logical  logical_not< T > logical  logical_or< T > logical  minus< T > arithmetic  modulus< T > arithmetic  negate< T > arithmetic  not_equal_to< T > relational  plus< T > arithmetic  multiplies< T > arithmetic 
  • 42. 1 // Fig. 21.42: fig21_42.cpp 2 // Demonstrating function objects. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; fig21_42.cpp 7 (1 of 4) 8 #include <vector> // vector class-template definition 9 #include <algorithm> // copy algorithm 10 #include <numeric> // accumulate algorithm 11 #include <functional> // binary_function definition 12 13 // binary function adds square of its second argument and Tạo một hàm để dùng 14 // running total in its first argument, then returns sum với accumulate. 15 int sumSquares( int total, int value ) 16 { 17 return total + value * value; 18 19 } // end function sumSquares 20 42
  • 43. 21 // binary function class template defines overloaded operator() 22 // that adds suare of its second argument and running total in 23 // its first argument, then returns sum 24 template< class T > 25 class SumSquaresClass : public std::binary_function< T, T, T > { 26 fig21_42.cpp 27 public: Tạo một function object (2 of 4) 28 (nó còn có thể đóng gói 29 // add square of value to total and return result 30 const T operator()( const T &total, const T &value ) dữ liệu). 31 { Overload operator(). 32 return total + value * value; 33 34 } // end function operator() 35 36 }; // end class SumSquaresClass 37 43
  • 44. 38 int main() 39 { 40 const int SIZE = 10; 41 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 42 43 std::vector< int > integers( array, array + SIZE ); fig21_42.cpp 44 (3 of 4) 45 std::ostream_iterator< int > output( cout, " " ); 46 47 int result = 0; 48 49 cout << "vector v contains:n"; đầu tiên, accumulate 50 std::copy( integers.begin(), integers.end(), output ); truyền 0 và phần tử 51 thứ nhất lần lượt làm 52 // calculate sum of squares of elements of vector integers 53 // using binary function sumSquares các tham số. Sau đó, nó 54 result = std::accumulate( integers.begin(), integers.end(), dùng kếtquả trả về làm 55 0, sumSquares ); tham số thứ nhất, và lặp 56 qua các phần tử còn lại. 57 cout << "nnSum of squares of elements in integers using " 58 << "binarynfunction sumSquares: " << result; 59 44
  • 45. 60 // calculate sum of squares of elements of vector integers 61 // using binary-function object 62 result = std::accumulate( integers.begin(), integers.end(), 63 0, SumSquaresClass< int >() ); 64 fig21_42.cpp 65 cout << "nnSum of squares of elements in integers using " (4 of 4) 66 << "binarynfunction object of type " 67 << "SumSquaresClass< int >: " << result << endl; fig21_42.cpp 68 output (1 of 1) 69 return 0; 70 dùng accumulate với 71 } // end main một function object. vector v contains: 1 2 3 4 5 6 7 8 9 10   Sum of squares of elements in integers using binary function sumSquares: 385   Sum of squares of elements in integers using binary function object of type SumSquaresClass< int >: 385 45