Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

So sánh Set vs Map trong C++ STL

std::set và std::map đều là container liên kết (red-black tree), giữ phần tử đã sắp xếp, duy nhất. Khác biệt cốt lõi: set lưu key, map lưu cặp key-value.

Bảng so sánh nhanh

Đặc điểmstd::set<Key>std::map<Key, Value>
Phần tửKey (duy nhất)Pair<Key, Value> (key duy nhất)
Truy cập giá trịChỉ keymap[key] (tạo nếu chưa có), at(key) (throw nếu không có)
Iterator deref*it → Key*it → Pair<const Key, Value> (it->first, it->second)
Chèninsert(key)insert({key, val}), emplace(key, val)
Tìm kiếmfind(key) → iteratorfind(key) → iterator đến pair
Độ phức tạpO(log n) tất cảO(log n) tất cả
Sắp xếpTheo Key (less<Key> mặc định)Theo Key (less<Key> mặc định)

Ví dụ Set

#include <iostream>
#include <set>
using namespace std;

int main() {
    set<int> s = {7, 6, 1, 4, 2, 9, 10};
    cout << "Set elements: ";
    for (int x : s) cout << x << ' '; // 1 2 4 6 7 9 10
    cout << endl;
    return 0;
}

Ví dụ Map

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    map<string, int> m;
    m["Alice"] = 25;
    m["Bob"] = 30;
    m.emplace("Charlie", 35);

    cout << "Map elements:\n";
    for (auto& [k, v] : m) // C++17 structured binding
        cout << k << " -> " << v << '\n';

    // Truy cập
    cout << "Alice age: " << m.at("Alice") << endl; // 25
    // m["David"] = 40; // tự tạo nếu chưa có
    return 0;
}

Kết quả Map

Map elements:
Alice -> 25
Bob -> 30
Charlie -> 35
Alice age: 25

Các biến thể (C++11)

ContainerKey duy nhất?Sắp xếp?Cấu trúc
setCóCóTree
multisetKhông (cho phép trùng)CóTree
unordered_setCóKhông (hash)Hash table
unordered_multisetKhôngKhôngHash table
mapCóCóTree
multimapKhôngCóTree
unordered_mapCóKhôngHash table
unordered_multimapKhôngKhôngHash table

Chọn cái nào?

  • Chỉ cần tập hợp key duy nhất, cần thứ tự → set.
  • Cần ánh xạ key → value, key duy nhất → map.
  • Cho phép key trùng → multiset/multimap.
  • Không cần thứ tự, cần O(1) trung bình → unordered_set/unordered_map.
  • Cần thứ tự + tìm kiếm nhanh → set/map (tree).