Professional Documents
Culture Documents
LTPT
LTPT
Medium
#9Slide03 Bebas Neue
Regular
2. Tính chất:
-Set là một container mà mỗi phần tử trong đó là duy nhất, tức là
sẽ không có hai phần tử có giá trị giống nhau tồn tại trong set.
-Các phần tử trong set-được gọi là khóa-có giá trị tăng dần về giá
trị số và tăng dần về thứ tự từ điển nếu là xâu kí tự. Mặc định
trong set là tăng dần và chúng ta có thể viết lại hàm so sánh theo
mục đích của chúng ta.]
I/. Sử dụng Set trong C++
3. Khai báo:
Để khai báo một set, ta sử dụng những cú pháp sau:
I/. Sử dụng Set trong C++
Ví dụ:
I/. Sử dụng Set trong C++
Mặc dù chúng ta có thể dùng bất cứ kiểu dữ liệu nào có
*Lưu ý: trong C++ để khai báo type, tuy nhiên do trong set các phần
tử cần phải được sắp xếp, nên kiểu của chúng cũng phải là
kiểu dữ liệu có thể được so sánh.
I/. Sử dụng Set trong C++
4. Các thao tác với set:
a) Duyệt set:
- Duyệt bằng iterator theo cú pháp:
I/. Sử dụng Set trong C++
Ví dụ: Với set integers={1,2,3,4,5}; đoạn chương trình
trên sẽ có kết quả là:
I/. Sử dụng Set trong C++
b) Truy cập các phần tử trong set:
-Truy cập tuần tự vào các phần tử của set, thông qua
vòng lặp hoặc là trình lặp
I/. Sử dụng Set trong C++
Ví dụ:
a) Insert():
-Hàm insert là một hàm thành viên trong class std:list, có tác dụng chèn
một hoặc nhiều phần tử vào set cũng như tăng độ dài tương ứng của nó và
tự động sắp xếp lại.
-Độ phức tạp: O(log(n))
I/. Sử dụng Set trong C++
Map trong C++ là một tập hợp các phần tử được sắp xếp theo thứ tự cụ thể, mà
mỗi phần tử trong đó được hình thành bởi sự kết hợp của một cặp khóa và giá trị
(key & value), với mỗi khóa là duy nhất trong map. Các giá trị trong map thì có thể
trùng lặp, chúng có thể thay đổi giá trị, cũng như là được chèn hoặc xóa khỏi map.
Các cấu trúc dữ liệu như mảng hay xâu kí tự, khi truy xuất dữ liệu bạn sẽ sử dụng
một tham số gọi là chỉ số, ví dụ như arr[1], str[2], ... Đối với cấu trúc dữ liệu map,
để truy xuất dữ liệu bạn sẽ sử dụng một tham số gọi là key.
1. Khái niệm:
C++:
I/. Map
Cấu trúc dữ liệu Map trong C++:
- Cấu trúc dữ liệu map trong C++ thuộc dạng
Red–black tree (cây đỏ đen).
•Trong các Node sẽ lưu giữ cặp khóa, giá trị
(key & value) cũng như con trỏ của các Node
con ( bên trái, phải) của nó.
•Các giá trị trong Node thỏa mãn điều kiện giá
trị của Node con bên trái < Giá trị Node cha <
Giá trị của Node con bên phải.
•Độ sâu của các Node bằng nhau và cây Node
thì cân bằng.
2. Cấu trúc dữ liệu Map trong C++:
Pair là gì?
- Pair nằm trong thư viện "utility" được sử dụng để kết hợp 2 kiểu dữ liệu
với nhau, nó cung cấp cách lưu trữ 2 giá trị đi kèm nhau nhưng chỉ sử dụng 1
biến.
- Phần tử thứ nhất của pair được gọi là first, phần tử thứ 2 của pair được gọi
là second.
- Cú pháp khai báo: pair<valueType1, valueType2> variableName;
2. Cấu trúc dữ liệu Map trong C++:
Ví dụ:
pair<string, string> dictionary;
Kết quả:
I/. Map
* Lưu ý:
- Do mỗi khóa trong map là duy nhất, nên nếu chúng ta chỉ định các phần tử có
cùng khóa thì dù giá trị của chúng có giống hay khác nhau thì chỉ có duy nhất
phần tử viết đầu tiên sẽ được lưu vào trong map.
4. Khai báo map trong
C++:
Ví dụ:
Kết quả:
I/. Map
-> Có thể thấy rõ sự khác biệt giữa cách truy cập phần tử trong map
bằng hàm at() và toán tử [] chính là ở kết quả khi chỉ định một key
không tồn tại trong map.
I/. Map
6. Duyệt map trong C++:
a. Duyệt map bằng iterator:
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main(){
map<int, int> mp;
mp={{1,2},{2,4},{3,5}};
map<int,int>::iterator it;
for(it = mp.begin(); it != mp.end(); it++){
cout << "key = " << (*it).first << ", value = " <<(*it).second << endl;
}}
6. Duyệt map trong C++:
key = 1, value = 2
key = 2, value = 4
Kết quả: key = 3, value = 5
Nếu bạn muốn truy cập vào phần tử đầu tiên trong map thì thông qua
iterator begin(), còn nếu muốn truy cập vào phần tử cuối cùng trong
map thì thông qua iterator rbegin().
6. Duyệt map trong C++:
b. Duyệt map bằng for each:
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main(){
map<int, int> mp;
mp={{1,2},{2,4},{3,5}};
for(pair<int, int> it : mp){ // Hoặc: for( auto it: mp )
cout << "key = " << it.first << ", value = " << it.second << endl;
}
}
6. Duyệt map trong C++:
map:
- auto là kiểu suy luận giúp tự xác định kiểu dữ liệu của giá trị lấy
từ map.
- it là tên một biến dùng để gán từng phần tử được lấy từ map.
key = 1, value = 2
Output : key = 2, value = 4
key = 3, value = 5
I/. Map
7. Một số hàm cơ bản của map:
a. Hàm insert:
- Đùng để thêm một phần tử vào trong map.
- Cú pháp: map[key]= value nếu key chưa tồn tại trong map
hoặc sẽ thay đổi value nếu key đã tồn tại.
7. Một số hàm cơ bản của map:
#include <bits/stdc++.h>
#include <map>
using namespace std;
int main() {
map<int, int> mp;
mp.insert({1,2}); // Thêm cặp (1,2)
mp.insert({2,4}); // Thêm cặp (2,4)
mp[3]=10;// Thêm cặp (3,10)
Ví dụ: mp[2]=5; // Thay đổi cặp (2,4) thành cặp
(2,5)
cout << "mp={\n";
for (auto it: mp) {
cout <<
"{"<<it.first<<","<<it.second<< '\n';
} cout<<"}"<<endl;
return 0;
}
7. Một số hàm cơ bản của map:
mp={
{1,2}
Kết quả: {2,5}
{3,10}
}
7. Một số hàm cơ bản của map:
b. Hàm size:
- Trả về số lượng phần tử trong map.
- Cú pháp: mp.size()
d. Hàm find:
- Tìm kiếm sự xuất hiện của một key nào đó
trong map. Độ phức tạp là O(logN).
- Cú pháp: mp.find(key);
- Hàm này trả về iterator tới cặp phần tử nếu
nó tìm thấy, ngược lại nó trả về iterator end()
của map khi giá trị key tìm kiếm không tồn tại
trong map.
7. Một số hàm cơ bản của map:
e. Hàm count:
- Hàm này dùng để đếm số lần
xuất hiện của một key nào đó
trong map. Đối với map hàm
cout trả về 0 hoặc 1, có thể sử
dụng hàm này để thay cho hàm
find. Độ phức tạp là O(log N).
- Cú pháp: mp.cout(key);
7. Một số hàm cơ bản của map:
rong C++:
- Xóa thông qua iterator:
Cú pháp: mp.erase(itr);
9. Ứng dụng:
Vd:
Cho một danh sách các số điện thoại kèm theo tên của chủ thuê bao đó.
Yêu cầu đầu vào là một số điện thoại (key), hãy đưa ra tên của chủ thuê
bao (value)
Cho danh sách thể hiện lịch sử đi muộn của các nhân viên một công ty
nào đó. Hãy tìm xem nhân viên (key) nào có số lần đi muộn (value)
nhiều nhất?
9. Ứng dụng:
Hàm cout:
- Hàm count() trong multimap
khi bạn sử dụng để đếm số lần
xuất hiện của key, trả về giá trị
tương ứng với số cặp phần tử
có key tương ứng. Nếu key bạn
đếm không xuất hiện thì hàm
này trả về 0.
II/. Multimap trong C++
Hàm eraser:
- Unordered_map
cũng tương tự như
map nhưng các key
trong unorderd_map
không có thứ tự như Vd:
map và multimap.
III/. Unorderd_map
- Map, multimap và unordered_map cho phép bạn lưu trữ cặp khóa-giá
trị, trong khi set chỉ lưu trữ các giá trị.
- Map, multimap đảm bảo thứ tự của các phần tử dựa trên khóa, trong
khi Set được sắp xếp dựa trên giá trị của chúng và unordered_map thì
theo thứ tự giá trị hash của khóa.
- Set và unordered_map được sử dụng khi bạn quan tâm đến tính duy
nhất của các key, trong khi map được sử dụng khi bạn cần ánh xạ từ khóa
đến giá trị và ở multimap thì key có thể trùng nhau.
IV/. So sánh