Chuyển tới nội dung chính

std::unordered_set::equal_range

#include <unordered_set>

            std::pair<iterator, iterator> equal_range(const key_type& key);
std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const;

Trả về một cặp iterator xác định phạm vi các phần tử trong std::unordered_set có giá trị bằng với giá trị key cho trước. Vì std::unordered_set lưu trữ các phần tử duy nhất, phạm vi này sẽ chỉ chứa tối đa một phần tử.

Tham số

key

  • Giá trị cần tìm kiếm.

Giá trị trả về

std::pair<iterator, iterator>

  • Cặp iterator xác định phạm vi (phiên bản không const).

std::pair<const_iterator, const_iterator>

  • Cặp const_iterator xác định phạm vi (phiên bản const).

Đặc điểm

  1. Phạm vi phần tử: equal_range() trả về một phạm vi các phần tử. Tuy nhiên, trong std::unordered_set, phạm vi này sẽ chỉ chứa tối đa một phần tử do tính duy nhất của các phần tử.
  2. Kết hợp lower_bound()upper_bound(): equal_range() tương đương với việc gọi lower_bound() (trong trường hợp này luôn bằng find()) và upper_bound() cùng một lúc. Tuy nhiên, lower_bound()upper_bound() không tồn tại trong std::unordered_set.
  3. Không thay đổi std::unordered_set: equal_range() là một hàm const, nó không làm thay đổi nội dung hay trạng thái của std::unordered_set.
  4. Phạm vi rỗng nếu không tìm thấy: Nếu không có phần tử nào trong std::unordered_set có giá trị bằng key, equal_range() trả về một phạm vi rỗng (trong đó pair.firstpair.second bằng nhau và cùng bằng end()).
  5. Ít hữu dụng hơn với std::unordered_set: Do tính duy nhất của các phần tử trong std::unordered_set, equal_range() không mang lại nhiều lợi ích như trong std::multiset (nơi nó có thể trả về phạm vi chứa nhiều phần tử trùng lặp). Trong hầu hết các trường hợp, find() sẽ phù hợp hơn khi sử dụng với std::unordered_set.
  6. Độ phức tạp: Độ phức tạp trung bình của equal_range()O(1), trường hợp xấu nhất là O(n), với n là số phần tử trong std::unordered_set.

Ví dụ

#include <iostream>
#include <unordered_set>

int main() {
std::unordered_set<int> myset = {10, 20, 30, 40, 50};

// Tìm phạm vi các phần tử có giá trị bằng 30
auto range = myset.equal_range(30);

if (range.first != myset.end()) {
std::cout << "Element 30 found\n";
std::cout << "Value: " << *range.first << '\n';
// *range.second is undefined behavior
} else {
std::cout << "Element 30 not found\n";
}

// Tìm phạm vi các phần tử có giá trị bằng 35 (không tồn tại)
range = myset.equal_range(35);

if (range.first == range.second) {
std::cout << "Element 35 not found\n"; // Output: Element 35 not found
}

return 0;
}

Các hàm liên quan

countĐếm số lượng phần tử có giá trị bằng với giá trị cho trước trong std::unordered_set
findTìm kiếm một phần tử có giá trị bằng với giá trị cho trước trong std::unordered_set