(+84) 236.3827111 ex. 402

Tập hợp Set trong C++


Khái niệm

Set để lưu trữ các phần tử không bị trùng lặp, và các phần tử này chính là các khóa.

Khi duyệt set theo iterator từ begin đến end, các phần tử của set sẽ tăng dần theo phép toán so sánh.

Có thể viết lại hàm so sánh theo ý mình

Khai báo:

#include

set s;

set > s;

Hoặc viết class so sánh theo ý mình:

struct cmp{

bool operator() (int a,int b) {return a

};

set myset ;

Các hàm của set

size : trả về kích thước hiện tại của set.

empty : true nếu set rỗng, và ngược lại.

insert : Chèn phần tử vào set.

erase : xóa phần tử, có 2 kiểu xóa: xóa theo iterator, hoặc là xóa theo khóa.

clear : xóa tất cả set.

swap : đổi 2 set cho nhau.

Truy cập phần tử:

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.

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.

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.

count : trả về số lần xuất hiện của khóa trong container. Nhưng trong set, các phần tử chỉ xuất hiện một lần, nên hàm này có ý nghĩa là sẽ return 1 nếu khóa có trong container, và 0 nếu không có.

Ví dụ 1:

#include

#include

using namespace std;

main() {

set s;

set ::iterator it; s.insert(9); // s={9}

s.insert(5); // s={5,9}

cout << *s.begin() << endl; //In ra 5

s.insert(1); // s={1,5,9}

cout << *s.begin() << endl; // In ra 1

it=s.find(5);

if (it==s.end()) cout << "Khong co trong container" << endl; else cout << "Co trong container" << endl;

s.erase(it); // s={1,9}

s.erase(1); // s={9}

s.insert(3); // s={3,9}

s.insert(4); // s={3,4,9}

it=s.lower_bound(4);

if (it==s.end()) cout << "Khong co phan tu nao trong set khong be hon 4" << endl; else cout << "Phan tu be nhat khong be hon 4 la " << *it << endl;

it=s.lower_bound(10);

if (it==s.end()) cout << "Khong co phan tu nao trong set khong be hon 10" << endl; else cout << "Phan tu be nhat khong be hon 10 la " << *it << endl;

it=s.upper_bound(4);

if (it==s.end()) cout << "Khong co phan tu nao trong set lon hon 4" << endl; else cout << "Phan tu be nhat lon hon 4 la " << *it << endl;

/* Duyet tập hợp */

for (it=s.begin();it!=s.end();it++) {

cout << *it << " ";

}

// In ra 3 4 9

cout << endl; system("pause");

}

Ví dụ 2:

#include

#include

#include using namespace std;

main() {

set > s;

set > :: iterator it; // Phép toán so sánh là greater

s.insert(1); // s={1}

s.insert(2); // s={2,1}

s.insert(4); // s={4,2,1}

s.insert(9); // s={9,4,2,1}

/* Tim phần tử lớn nhất bé hơn hoặc bằng 5 */

it=s.lower_bound(5);

cout << *it << endl; // In ra 4

/* Tim phần tử lớn nhất bé hơn 4 */ it=s.upper_bound(4);

cout << *it << endl; // In ra 2

system("pause");

}