×

Xóa phần tử khỏi set với std::set::erase() trong C++

Trong ngôn ngữ lập trình C++, std::set là một container thuộc thư viện chuẩn (STL) và được sử dụng để lưu trữ các giá trị độc nhất theo một thứ tự nhất định. Một trong những tính năng quan trọng mà std::set cung cấp là khả năng xóa phần tử khỏi tập hợp. Hàm erase là phương thức thường được sử dụng để thực hiện nhiệm vụ này.

Cách sử dụng erase trong std::set

Có ba cách phổ biến để xóa một phần tử khỏi std::set sử dụng phương thức erase:

  1. Xóa theo giá trị:

    • Hàm erase tìm kiếm và loại bỏ phần tử có giá trị xác định.
    • Prototype: size_type erase(const key_type& key);
    • Ví dụ:
      #include <iostream>
      #include <set>
      
      int main() {
          std::set<int> mySet = {1, 2, 3, 4, 5};
          mySet.erase(3);  // Xóa phần tử có giá trị là 3.
          
          for (int value : mySet) {
              std::cout << value << " ";
          }
      
          return 0;
      }
      
  2. Xóa theo iterator:

    • Hàm erase xóa phần tử tại vị trí do iterator chỉ định.
    • Prototype: iterator erase(iterator pos);
    • Ví dụ:
      #include <iostream>
      #include <set>
      
      int main() {
          std::set<int> mySet = {1, 2, 3, 4, 5};
          auto it = mySet.find(3);  // Tìm iterator chỉ đến phần tử có giá trị là 3.
          if (it != mySet.end()) {
              mySet.erase(it);  // Xóa phần tử thông qua iterator.
          }
      
          for (int value : mySet) {
              std::cout << value << " ";
          }
      
          return 0;
      }
      
  3. Xóa theo range:

    • Hàm erase xóa tất cả các phần tử trong khoảng từ first đến last.
    • Prototype: iterator erase(iterator first, iterator last);
    • Ví dụ:
      #include <iostream>
      #include <set>
      
      int main() {
          std::set<int> mySet = {1, 2, 3, 4, 5};
          auto start = mySet.find(2);  // Tìm iterator chỉ đến phần tử có giá trị là 2.
          auto end = mySet.find(4);    // Tìm iterator chỉ đến phần tử có giá trị là 4.
          mySet.erase(start, end);     // Xóa các phần tử từ 2 đến trước 4.
      
          for (int value : mySet) {
              std::cout << value << " ";
          }
      
          return 0;
      }
      

Điều cần lưu ý khi sử dụng erase trong std::set

  • Khi sử dụng erase để xóa theo giá trị, nếu phần tử không tồn tại trong set, hàm này sẽ không làm gì và trả về 0.
  • Khi sử dụng erase để xóa theo iterator, iterator phải hợp lệ và trỏ đến phần tử trong set, nếu không sẽ dẫn đến hành vi không xác định (undefined behavior).
  • Khi xóa theo khoảng (range), khoảng này phải hợp lệ và first phải nằm trước hoặc bằng last.

Hiệu năng và độ phức tạp

  • Hàm erase có độ phức tạp trung bình là O(log n) khi xóa theo giá trị hoặc iterator.
  • Khi xóa theo khoảng, độ phức tạp trung bình là O(k log n), với k là số phần tử bị xóa.

Như vậy, std::set::erase là một công cụ mạnh mẽ cho phép các lập trình viên quản lý các phần tử trong set một cách linh hoạt và hiệu quả. Hiểu rõ cách sử dụng hàm này giúp bạn dễ dàng thao tác với dữ liệu mà không gặp phải các lỗi không mong muốn.

Comments