C++ toàn tập

Đây là ngôn ngữ rất phổ biến được nhiều người lựa chọn và nó có cơ hội việc làm thu nhập rất cao nếu bạn thông thạo nó. Vì vậy Blog đã viết một loạt bài về C++ với mục đích giúp các bạn tiện tra cứu và học hỏi.

Cơ bản:

STL

  • Stack (ngăn xếp)
  • Vector trong C++
  • Queue (hàng đợi)
  • Deque (hàng đợi hai đầu)
  • Priority queue (hàng đợi ưu tiên)
  • Set (tập hợp)
  • List (danh sách liên kết)
  • Multiset (tập hợp)
  • Comments trong C++

    Các chú thích chương trình là các câu lệnh giải thích mà bạn có thể đưa vào trong mã C ++. Những nhận xét này giúp mọi người đọc mã nguồn. Tất cả các ngôn ngữ lập trình đều cho phép một số dạng nhận xét.

    C ++ hỗ trợ nhận xét một dòng và nhiều dòng. Tất cả các ký tự có sẵn bên trong bất kỳ bình luận nào đều bị bỏ qua bởi trình biên dịch C ++.

    Các chú thích C ++ bắt đầu bằng / * và kết thúc bằng * /. Ví dụ –

    /* This is a comment */
    
    /* C++ comments can also
       * span multiple lines
    */
    
    Nhận xét cũng có thể bắt đầu bằng //, mở rộng đến cuối dòng. Ví dụ –
    #include 
    using namespace std;
    
    main() {
       cout << "Hello World"; // prints Hello World
       
       return 0;
    }
    
     

    Khi mã trên được biên dịch, nó sẽ bỏ qua // bản in Hello World và bản thực thi cuối cùng sẽ tạo ra kết quả sau:

    Hello World
    
    Trong một / * và * / chú thích, // các ký tự không có ý nghĩa đặc biệt. Trong // nhận xét, / * và * / không có ý nghĩa đặc biệt. Vì vậy, bạn có thể “làm tổ” một loại bình luận trong loại khác. Ví dụ –
    /* Comment out printing of Hello World:
    
    cout << "Hello World"; // prints Hello World
    
    */

    Cú pháp cơ bản của C ++

    Khi chúng ta xem xét một chương trình C ++, nó có thể được định nghĩa như một tập hợp các đối tượng giao tiếp thông qua việc gọi các phương thức của nhau. Bây giờ chúng ta hãy xem xét những gì một lớp, đối tượng, phương thức và các biến tức thời có nghĩa là gì.

    • Đối tượng – Đối tượng có các trạng thái và hành vi. Ví dụ: Chó có trạng thái – màu sắc, tên, giống cũng như hành vi – vẫy, sủa, ăn uống. Một đối tượng là một thể hiện của một lớp.
    • Lớp – Một lớp có thể được định nghĩa là một bản mẫu / kế hoạch chi tiết mô tả các hành vi / trạng thái mà đối tượng của kiểu hỗ trợ của nó.
    • Phương pháp – Một phương pháp cơ bản là một hành vi. Một lớp có thể chứa nhiều phương thức. Đó là trong các phương thức mà các logic được viết, dữ liệu được thao tác và tất cả các hành động được thực thi.
    • Instance Variables – Mỗi đối tượng có tập các biến cá thể duy nhất của nó. Trạng thái của đối tượng được tạo bởi các giá trị được gán cho các biến cá thể này.

    Cấu trúc chương trình C ++

    Chúng ta hãy nhìn vào một mã đơn giản có thể in chữ Hello World .

    <span class="com">#include</span> <span class="str">&lt;iostream&gt;</span>
    <span class="kwd">using</span> <span class="kwd">namespace</span><span class="pln"> std</span><span class="pun">;</span>
    
    <span class="com">// main() is where program execution begins.</span>
    <span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span> <span class="pun">{</span><span class="pln">
       cout </span><span class="pun">&lt;&lt;</span> <span class="str">"Hello World"</span><span class="pun">;</span> <span class="com">// prints Hello World</span>
       <span class="kwd">return</span> <span class="lit">0</span><span class="pun">;</span>
    <span class="pun">}</span>
    Chúng ta hãy xem xét các phần khác nhau của chương trình trên –

    • Ngôn ngữ C ++ định nghĩa một số tiêu đề, chứa các thông tin cần thiết hoặc hữu ích cho chương trình của bạn. Đối với chương trình này, tiêu đề <iostream> là cần thiết.
    • Dòng sử dụng không gian tên std; yêu cầu trình biên dịch sử dụng không gian tên std. Không gian tên là một bổ sung tương đối gần đây cho C ++.
    • Dòng tiếp theo ‘ // main () là nơi bắt đầu thực hiện chương trình. ‘là một chú thích một dòng có sẵn trong C ++. Các chú thích một dòng bắt đầu bằng // và dừng ở cuối dòng.
    • Dòng int main () là hàm chính nơi bắt đầu thực hiện chương trình.
    • Dòng lệnh tiếp theo << “Đây là chương trình C ++ đầu tiên của tôi.”; gây ra thông báo “Đây là chương trình C ++ đầu tiên của tôi” được hiển thị trên màn hình.
    • Dòng tiếp theo trả về 0; chấm dứt hàm main () và làm cho nó trả về giá trị 0 cho quá trình gọi.

    Biên dịch và thực thi chương trình C ++

    Hãy xem cách lưu tệp, biên dịch và chạy chương trình. Vui lòng làm theo các bước dưới đây –

    • Mở trình soạn thảo văn bản và thêm mã như trên.
    • Lưu tệp dưới dạng: hello.cpp
    • Mở một dấu nhắc lệnh và đi đến thư mục mà bạn đã lưu tệp.
    • Nhập ‘g ++ hello.cpp’ và nhấn enter để biên dịch mã của bạn. Nếu không có lỗi trong mã của bạn, dấu nhắc lệnh sẽ đưa bạn đến dòng tiếp theo và sẽ tạo ra tệp thực thi a.out.
    • Bây giờ, gõ ‘a.out’ để chạy chương trình của bạn.
    • Bạn sẽ có thể nhìn thấy ‘Hello World’ được in trên cửa sổ.
    $ g++ hello.cpp
    $ ./a.out
    Hello World
    
    Đảm bảo rằng g ++ nằm trong đường dẫn của bạn và bạn đang chạy nó trong thư mục chứa tệp hello.cpp.

    Dấu chấm phẩy và khối trong C ++

    Trong C ++, dấu chấm phẩy là một dấu kết thúc câu lệnh. Tức là, mỗi câu lệnh riêng lẻ phải được kết thúc bằng dấu chấm phẩy. Nó cho biết kết thúc của một thực thể logic.

    Ví dụ, sau đây là ba câu lệnh khác nhau –

    x = y;
    y = y + 1;
    add(x, y);
    
    Khối là một tập hợp các câu lệnh được kết nối hợp lý được bao quanh bằng cách mở và đóng niềng răng. Ví dụ –
    {
       cout &lt;&lt; "Hello World"; // prints Hello World
       return 0;
    }
    
    C ++ không nhận ra sự kết thúc của dòng như một terminator. Vì lý do này, nó không quan trọng nơi bạn đặt một tuyên bố trong một dòng. Ví dụ –
    x = y;
    y = y + 1;
    add(x, y);
    
    giống như
    x = y; y = y + 1; add(x, y);
    

    Định danh C ++

    Mã định danh C ++ là tên được sử dụng để xác định biến, hàm, lớp, mô-đun hoặc bất kỳ mục nào do người dùng xác định khác. Mã định danh bắt đầu bằng chữ cái A đến Z hoặc từ a đến z hoặc dấu gạch dưới (_) theo sau là 0 hoặc nhiều chữ cái, dấu gạch dưới và chữ số (0 đến 9).

    C ++ không cho phép các ký tự dấu câu như @, $ và% trong số nhận dạng. C ++ là một ngôn ngữ lập trình phân biệt chữ hoa chữ thường. Do đó, Nhân lựcvà nhân lực là hai định danh khác nhau trong C ++.

    Dưới đây là một số ví dụ về số nhận dạng có thể chấp nhận –

    mohd       zara    abc   move_name  a_123
    myname50   _temp   j     a23b9      retVal
    

    Từ khóa C ++

    Danh sách sau đây hiển thị các từ dành riêng trong C ++. Các từ dành riêng này có thể không được sử dụng làm hằng số hoặc biến hoặc bất kỳ tên định danh nào khác.

    asm else new this
    auto enum operator throw
    bool explicit private true
    break export protected try
    case extern public typedef
    catch false register typeid
    char float reinterpret_cast typename
    class for return union
    const friend short unsigned
    const_cast goto signed using
    continue if sizeof virtual
    default inline static void
    delete int static_cast volatile
    do long struct wchar_t
    double mutable switch while
    dynamic_cast namespace template

    Một vài ký tự có một biểu diễn thay thế, được gọi là một chuỗi dấu vết. Một dấu vết là một chuỗi ba ký tự đại diện cho một ký tự đơn và chuỗi luôn bắt đầu bằng hai dấu chấm hỏi.Trigraphs

    Trigraphs được mở rộng bất cứ nơi nào chúng xuất hiện, bao gồm trong các chuỗi ký tự và các ký tự chữ, trong các chú thích và các chỉ thị tiền xử lý.

    Sau đây là các chuỗi dấu vết được sử dụng thường xuyên nhất –

    Trigraph Thay thế
    ?? = #
    ?? / \
    ?? ‘ ^
    ?? ( [
    ??) ]
    ??! |
    ?? < {
    ??> }
    ?? – ~

    Tất cả các trình biên dịch không hỗ trợ các dấu vết và chúng không được khuyên dùng vì bản chất khó hiểu của chúng.

    Khoảng trống trong C ++

    Một dòng chỉ chứa khoảng trắng, có thể với một chú thích, được gọi là một dòng trống, và trình biên dịch C ++ hoàn toàn bỏ qua nó.

    Khoảng trống là thuật ngữ được sử dụng trong C ++ để mô tả khoảng trống, tab, ký tự dòng mới và nhận xét. Khoảng trắng phân tách một phần của câu lệnh từ một câu lệnh khác và cho phép trình biên dịch xác định vị trí của một phần tử trong câu lệnh, chẳng hạn như int, kết thúc và phần tử tiếp theo bắt đầu.

    Tuyên bố 1

    int age;
    
    Trong câu lệnh trên, phải có ít nhất một ký tự khoảng trống (thường là một dấu cách) giữa int và age để trình biên dịch có thể phân biệt chúng.

    Tuyên bố 2

    fruit = apples + oranges;   // Get the total fruit
    
    Trong câu lệnh trên 2, không có ký tự khoảng trắng nào cần thiết giữa trái cây và = hoặc giữa = và táo, mặc dù bạn được tự do đưa vào một số nếu bạn muốn cho mục đích có thể đọc được.

    Cú pháp cơ bản của C ++

    Khi chúng ta xem xét một chương trình C ++, nó có thể được định nghĩa như một tập hợp các đối tượng giao tiếp thông qua việc gọi các phương thức của nhau. Bây giờ chúng ta hãy xem xét những gì một lớp, đối tượng, phương thức và các biến tức thời có nghĩa là gì.

    • Đối tượng – Đối tượng có các trạng thái và hành vi. Ví dụ: Chó có trạng thái – màu sắc, tên, giống cũng như hành vi – vẫy, sủa, ăn uống. Một đối tượng là một thể hiện của một lớp.
    • Lớp – Một lớp có thể được định nghĩa là một bản mẫu / kế hoạch chi tiết mô tả các hành vi / trạng thái mà đối tượng của kiểu hỗ trợ của nó.
    • Phương pháp – Một phương pháp cơ bản là một hành vi. Một lớp có thể chứa nhiều phương thức. Đó là trong các phương thức mà các logic được viết, dữ liệu được thao tác và tất cả các hành động được thực thi.
    • Instance Variables – Mỗi đối tượng có tập các biến cá thể duy nhất của nó. Trạng thái của đối tượng được tạo bởi các giá trị được gán cho các biến cá thể này.

    Cấu trúc chương trình C ++

    Chúng ta hãy nhìn vào một mã đơn giản có thể in chữ Hello World .

    #include 
    using namespace std;
    
    // main() is where program execution begins.
    int main() {
       cout &lt;&lt; "Hello World"; // prints Hello World
       return 0;
    }
    
    Chúng ta hãy xem xét các phần khác nhau của chương trình trên –

    • Ngôn ngữ C ++ định nghĩa một số tiêu đề, chứa các thông tin cần thiết hoặc hữu ích cho chương trình của bạn. Đối với chương trình này, tiêu đề <iostream> là cần thiết.
    • Dòng sử dụng không gian tên std; yêu cầu trình biên dịch sử dụng không gian tên std. Không gian tên là một bổ sung tương đối gần đây cho C ++.
    • Dòng tiếp theo ‘ // main () là nơi bắt đầu thực hiện chương trình. ‘là một chú thích một dòng có sẵn trong C ++. Các chú thích một dòng bắt đầu bằng // và dừng ở cuối dòng.
    • Dòng int main () là hàm chính nơi bắt đầu thực hiện chương trình.
    • Dòng lệnh tiếp theo << “Đây là chương trình C ++ đầu tiên của tôi.”; gây ra thông báo “Đây là chương trình C ++ đầu tiên của tôi” được hiển thị trên màn hình.
    • Dòng tiếp theo trả về 0; chấm dứt hàm main () và làm cho nó trả về giá trị 0 cho quá trình gọi.

    Biên dịch và thực thi chương trình C ++

    Hãy xem cách lưu tệp, biên dịch và chạy chương trình. Vui lòng làm theo các bước dưới đây –

    • Mở trình soạn thảo văn bản và thêm mã như trên.
    • Lưu tệp dưới dạng: hello.cpp
    • Mở một dấu nhắc lệnh và đi đến thư mục mà bạn đã lưu tệp.
    • Nhập ‘g ++ hello.cpp’ và nhấn enter để biên dịch mã của bạn. Nếu không có lỗi trong mã của bạn, dấu nhắc lệnh sẽ đưa bạn đến dòng tiếp theo và sẽ tạo ra tệp thực thi a.out.
    • Bây giờ, gõ ‘a.out’ để chạy chương trình của bạn.
    • Bạn sẽ có thể nhìn thấy ‘Hello World’ được in trên cửa sổ.
    $ g++ hello.cpp
    $ ./a.out
    Hello World
    
    Đảm bảo rằng g ++ nằm trong đường dẫn của bạn và bạn đang chạy nó trong thư mục chứa tệp hello.cpp.

    Dấu chấm phẩy và khối trong C ++

    Trong C ++, dấu chấm phẩy là một dấu kết thúc câu lệnh. Tức là, mỗi câu lệnh riêng lẻ phải được kết thúc bằng dấu chấm phẩy. Nó cho biết kết thúc của một thực thể logic.

    Ví dụ, sau đây là ba câu lệnh khác nhau –

    x = y;
    y = y + 1;
    add(x, y);
    
    Khối là một tập hợp các câu lệnh được kết nối hợp lý được bao quanh bằng cách mở và đóng niềng răng. Ví dụ –
    {
       cout &lt;&lt; "Hello World"; // prints Hello World
       return 0;
    }
    
    C ++ không nhận ra sự kết thúc của dòng như một terminator. Vì lý do này, nó không quan trọng nơi bạn đặt một tuyên bố trong một dòng. Ví dụ –
    x = y;
    y = y + 1;
    add(x, y);
    
    giống như
    x = y; y = y + 1; add(x, y);
    

    Định danh C ++

    Mã định danh C ++ là tên được sử dụng để xác định biến, hàm, lớp, mô-đun hoặc bất kỳ mục nào do người dùng xác định khác. Mã định danh bắt đầu bằng chữ cái A đến Z hoặc từ a đến z hoặc dấu gạch dưới (_) theo sau là 0 hoặc nhiều chữ cái, dấu gạch dưới và chữ số (0 đến 9).

    C ++ không cho phép các ký tự dấu câu như @, $ và% trong số nhận dạng. C ++ là một ngôn ngữ lập trình phân biệt chữ hoa chữ thường. Do đó, Nhân lựcvà nhân lực là hai định danh khác nhau trong C ++.

    Dưới đây là một số ví dụ về số nhận dạng có thể chấp nhận –

    mohd       zara    abc   move_name  a_123
    myname50   _temp   j     a23b9      retVal
    

    Từ khóa C ++

    Danh sách sau đây hiển thị các từ dành riêng trong C ++. Các từ dành riêng này có thể không được sử dụng làm hằng số hoặc biến hoặc bất kỳ tên định danh nào khác.

    asm else new this
    auto enum operator throw
    bool explicit private true
    break export protected try
    case extern public typedef
    catch false register typeid
    char float reinterpret_cast typename
    class for return union
    const friend short unsigned
    const_cast goto signed using
    continue if sizeof virtual
    default inline static void
    delete int static_cast volatile
    do long struct wchar_t
    double mutable switch while
    dynamic_cast namespace template


    Một vài ký tự có một biểu diễn thay thế, được gọi là một chuỗi dấu vết. Một dấu vết là một chuỗi ba ký tự đại diện cho một ký tự đơn và chuỗi luôn bắt đầu bằng hai dấu chấm hỏi.Trigraphs

    Trigraphs được mở rộng bất cứ nơi nào chúng xuất hiện, bao gồm trong các chuỗi ký tự và các ký tự chữ, trong các chú thích và các chỉ thị tiền xử lý.

    Sau đây là các chuỗi dấu vết được sử dụng thường xuyên nhất –

    Trigraph Thay thế
    ?? = #
    ?? / \
    ?? ‘ ^
    ?? ( [
    ??) ]
    ??! |
    ?? < {
    ??> }
    ?? – ~

    Tất cả các trình biên dịch không hỗ trợ các dấu vết và chúng không được khuyên dùng vì bản chất khó hiểu của chúng.

    Khoảng trống trong C ++

    Một dòng chỉ chứa khoảng trắng, có thể với một chú thích, được gọi là một dòng trống, và trình biên dịch C ++ hoàn toàn bỏ qua nó.

    Khoảng trống là thuật ngữ được sử dụng trong C ++ để mô tả khoảng trống, tab, ký tự dòng mới và nhận xét. Khoảng trắng phân tách một phần của câu lệnh từ một câu lệnh khác và cho phép trình biên dịch xác định vị trí của một phần tử trong câu lệnh, chẳng hạn như int, kết thúc và phần tử tiếp theo bắt đầu.

    Tuyên bố 1

    int age;
    
    Trong câu lệnh trên, phải có ít nhất một ký tự khoảng trống (thường là một dấu cách) giữa int và age để trình biên dịch có thể phân biệt chúng.

    Tuyên bố 2

    fruit = apples + oranges;   // Get the total fruit
    
    Trong câu lệnh trên 2, không có ký tự khoảng trắng nào cần thiết giữa trái cây và = hoặc giữa = và táo, mặc dù bạn được tự do đưa vào một số nếu bạn muốn cho mục đích có thể đọc được.

    Lập trình hướng đổi tượng (OOP) trên C++

    Lập trình hướng đối tượng (Object oriented programming) – như cái tên của nó, ta sẽ viết chương trình chứa các đối tượng (object). Lập trình hướng đối tượng nhằm mục đích triển khai các đối tượng thực tế(như nhà, xe,…). The main aim of OOP is to bind together the data and the functions that operates on them so that no other part of code can access this data except that function.
    Let us learn about different characteristics of an Object Oriented Programming language:
    Đối tượng: Objects are basic run-time entities in an object oriented system, objects are instances of a class these are defined user defined data types.
    ex:

    class person
    {
        char name[20];
        int id;
    public:
        void getdetails(){}
    };
    int main()
    {
       person p1; //p1 is a object
    }

    Object take up space in memory and have an associated address like a record in pascal or structure or union in C.

    When a program is executed the objects interact by sending messages to one another.

    Each object contains data and code to manipulate the data. Objects can interact without having to know details of each others data or code, it is sufficient to know the type of message accepted and type of response returned by the objects.

    Class: Class is a blueprint of data and functions or methods. Class does not take any space.

    Syntax for class:

    class class_name
    {
      private:
         //data members and member functions declarations
      public:
         //data members and member functions declarations
      protected:
         //data members and member functions declarations
    };

    Class is a user defined data type like structures and unions in C.

    By default class variables are private but in case of structure it is public. in above example person is a class.

    Đóng gói và trừu tượng hóa dữ liệu: Wrapping up(combing) of data and functions into a single unit is known as encapsulation. The data is not accessible to the outside world and only those functions which are wrapping in the class can access it. This insulation of the data from direct access by the program is called data hiding or information hiding.

    Data abstraction refers to, providing only needed information to the outside world and hiding implementation details. For example, consider a class Complex with public functions as getReal() and getImag(). We may implement the class as an array of size 2 or as two variables. The advantage of abstractions is, we can change implementation at any point, users of Complex class wont’t be affected as out method interface remains same. Had our implementation be public, we would not have been able to change it.

    Kế thừa: inheritance is the process by which objects of one class acquire the properties of objects of another class. It supports the concept of hierarchical classification. Inheritance provides re usability. This means that we can add additional features to an existing class without modifying it.

    Đa hình: polymorphism means ability to take more than one form. An operation may exhibit different behaviors in different instances. The behavior depends upon the types of data used in the operation.
    C++ supports operator overloading and function overloading.
    Operator overloading is the process of making an operator to exhibit different behaviors in different instances is known as operator overloading.
    Function overloading is using a single function name to perform different types of tasks.
    Polymorphism is extensively used in implementing inheritance.

    Dynamic Binding: In dynamic binding, the code to be executed in response to function call is decided at runtime. C++ has virtual functions to support this.

    Message Passing: Objects communicate with one another by sending and receiving information to each other. A message for an object is a request for execution of a procedure and therefore will invoke a function in the receiving object that generates the desired results. Message passing involves specifying the name of the object, the name of the function and the information to be sent.

    Phân biệt tham chiếu và tham trị

    Tham trị

    Tiếng Anh là pass-by-value. Tham trị có nghĩa là chỉ truyền giá trị của biến này cho một biến mới và khi thay đổi biến mới không làm thay đổi biến cũ

    truyen-tham-so

     

    Tham biến

    Tên tiếng anh là pass-by-reference. Truyền tham biến có nghĩa là truyển cho biến mới địa chị ô nhớ y hệt của biến cũ mặc dù tên biến khác. Khi thay đổi biến mới thì cũng làm thay đổi biến cũ. Truyển tham biến còn được hiểu là thêm một nickname mới cho biến cũ.

    tham-tri

    Cài đặt SDL cho CodeBlocks

    Tải về

    • Tải về: https://www.libsdl.org/projects/SDL_image/release/SDL2_image-devel-2.0.3-mingw.tar.gz
    • Giải nén ra thì thấy có 2 thư mục:
      • Bản 32bit: i686-w64-mingw32
      • Bản 64bit: x86_64-w64-mingw32
    • Ở đây ta dùng bản 32 bit (vì CodeBlock đang dùng mingw32),
    • Trong thư mục này có 4 thư mục bin, include, lib, share
    • Thư mục bin chứa SDL2.dll (liên kết khi chạy, copy file này vào thư mục
      mã nguồn project, cùng folder với main.cpp
      )
    • Thư mục include chứa các file .h (như stdio.h) khai báo các hàm của SDL. Cũng coppy vào thư mục project.
    • Thư mục lib chứa các thư viện (mã đối tượng) để liên kết chương trình. Tương tự như trên, cũng copy vào thư mục project

    Cấu hình CodeBlocks

    Settings / Compiler / Linker Settings / Other linker… 

    Gõ thêm vào: -lmingw32 -lSDL2main -lSDL2

    Làm như trên để khi biên dịch chương trình, Codeblocks sẽ biên dịch cả những thứ trong thư viện SDL

    Tiếp theo, chọn tab Search directories / Compilers

    Thêm vào đường dẫn đến thư mục SDL. Ví dụ: e:\myproject\SDL\

    Chuyển sang tab Linker, thêm đường dẫn tới thư mục lib. Ví dụ: e:\myproject\lib

     

    Multiset (tập hợp) trong C++

    Multiset giống như Set nhưng có thể chứa các khóa có giá trị giống nhau.

    Đọc thêm về Set tại: https://yeulaptrinh.pw/938/set-trong-c/

    Khai báo : giống như set.

    Các hàm thành viên:

    Capacity:

    • size : trả về kích thước hiện tại của multiset. ĐPT O(1)
    • empty : true nếu multiset rỗng, và ngược lại. ĐPT O(1).

    Chỉnh sửa:

    • insert : Chèn phần tử vào set. ĐPT O(logN).
    • erase :
      • xóa theo iterator ĐPT O(logN)
      • xóa theo khóa: xóa tất cả các phần tử bằng khóa trong multiset. ĐPT: O(logN) + số phần tử bị xóa.
    • clear : xóa tất cả set. ĐPT O(n).
    • swap : đổi 2 set cho nhau. ĐPT O(n).

    Operations:

    • find : trả về itarator trỏ đến phần tử cần tìm kiếm. Nếu không tìm thấy itarator trỏ về “end” của set. ĐPT O(logN). Dù trong multiset có nhiều phần tử bằng khóa thì nó cũng chỉ iterator đến một phần tử.
    • lower_bound : trả về iterator đến vị trí phần tử bé nhất mà không bé hơn (lớn hơn hoặc bằng) khóa (dĩ nhiên là theo phép so sánh), nếu không tìm thấy trả về vị trí “end” của set. ĐPT O(logN).
    • upper_bound: trả về iterator đến vị trí phần tử bé nhất mà lớn hơn khóa, nếu không tìm thấy trả về vị trí “end” của set.. ĐPT O(logN).
    • count : trả về số lần xuất hiện của khóa trong multiset. ĐPT O(logN) + số phần tử tìm được.

    Chương trình Demo:

    #include <iostream>
    
    #include <set>
    
    using namespace std;
    
    main() {
        multiset <int> s;
    
        multiset <int> :: iterator it;
    
        int i;
    
        for (i=1;i<=5;i++) s.insert(i*10); // s={10,20,30,40,50}
        s.insert(30);    // s={10,20,30,30,40,50}
        cout << s.count(30) << endl;    // In ra 2
        cout << s.count(20) << endl;    // In ra 1
        s.erase(30);    // s={10,20,40,50}
    
        /* Duyet set */
        for (it=s.begin();it!=s.end();it++) {
        cout << *it <<  " ";
        }
    
        //In ra 10 20 40 50 
        cout << endl; system("pause");
    }