Sử dụng thiết lập khi:
- Chúng tôi cần dữ liệu theo thứ tự (các yếu tố riêng biệt).
 
- Chúng tôi sẽ phải in / truy cập dữ liệu (theo thứ tự được sắp xếp).
 
- Chúng ta cần người tiền nhiệm / kế thừa các yếu tố.
 
Sử dụng unordered_set khi:
- Chúng ta cần giữ một tập hợp các yếu tố riêng biệt và không yêu cầu đặt hàng.
 
- Chúng ta cần truy cập phần tử đơn tức là không có giao dịch.
 
Ví dụ:
bộ:
Đầu vào: 1, 8, 2, 5, 3, 9
Đầu ra: 1, 2, 3, 5, 8, 9
Không có thứ tự_set:
Đầu vào: 1, 8, 2, 5, 3, 9
Đầu ra: 9 3 1 8 2 5 (có thể là thứ tự này, bị ảnh hưởng bởi hàm băm)
Khác biệt chủ yếu:

Lưu ý: (trong một số trường hợp setthuận tiện hơn) ví dụ sử dụng vectorlàm khóa
set<vector<int>> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
    cout<<vec<<endl;   // I have override << for vector
// 1 2
// 1 3 
Lý do tại sao vector<int>có thể là chìa khóa setvì vectorghi đè operator<.
Nhưng nếu bạn sử dụng, unordered_set<vector<int>>bạn phải tạo hàm băm cho vector<int>, vì vectơ không có hàm băm, vì vậy bạn phải xác định một hàm như:
struct VectorHash {
    size_t operator()(const std::vector<int>& v) const {
        std::hash<int> hasher;
        size_t seed = 0;
        for (int i : v) {
            seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
        }
        return seed;
    }
};
vector<vector<int>> two(){
    //unordered_set<vector<int>> s; // error vector<int> doesn't  have hash function
    unordered_set<vector<int>, VectorHash> s;
    s.insert({1, 2});
    s.insert({1, 3});
    s.insert({1, 2});
    for(const auto& vec:s)
        cout<<vec<<endl;
    // 1 2
    // 1 3
}
bạn có thể thấy rằng trong một số trường hợp unordered_setphức tạp hơn.
Chủ yếu được trích dẫn từ:
 https://www.geekforgeek.org/set-vs-unordered_set-c-stl/ 
https://stackoverflow.com/a/29855973/6329006