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

std::map::equal_range

#include <map>

            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::mapkey bằng với giá trị key cho trước. Vì std::map lưu trữ các key 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ủa key cần tìm kiếm.

Giá trị trả về

  • std::pair<iterator, iterator> (phiên bản không const): Cặp iterator xác định phạm vi.
  • std::pair<const_iterator, const_iterator> (phiên bản const): Cặp const_iterator xác định phạm vi.

Đặc điểm

  1. Phạm vi phần tử: equal_range() trả về một phạm vi các phần tử, mặc dù trong std::map phạm vi này sẽ luôn chứa tối đa một phần tử do tính duy nhất của các key.
  2. Kết hợp lower_bound()upper_bound(): equal_range() tương đương với việc gọi lower_bound()upper_bound() cùng một lúc.
  3. Không thay đổi std::map: 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::map.
  4. Hữu ích cho std::map: Mặc dù equal_range() có thể được sử dụng với std::setstd::multiset nhưng nó đặc biệt hữu ích với std::multisetstd::multiset cho phép các phần tử trùng lặp. Trong std::map, equal_range() chủ yếu được dùng để kiểm tra sự tồn tại và xác định vị trí có thể chèn.
  5. 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::mapkey bằng key, equal_range() trả về một phạm vi rỗng (trong đó pair.firstpair.second bằng nhau).
  6. Độ phức tạp: Độ phức tạp của equal_range()O(log n), với n là số phần tử trong std::map.

Ví dụ

#include <iostream>
#include <map>

int main() {
std::map<int, std::string> mymap = {
{10, "ten"},
{20, "twenty"},
{30, "thirty"},
{40, "forty"},
{50, "fifty"}
};

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

if (range.first != range.second) {
std::cout << "Element with key 30 found. Value: " << range.first->second << '\n'; // Output: Element with key 30 found. Value: thirty
// *range.second is undefined behavior
} else {
std::cout << "Element with key 30 not found\n";
}

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

if (range.first == range.second) {
std::cout << "Element with key 35 not found, would be inserted at a position\n"; // Output: Element with key 35 not found, would be inserted at a position
}

return 0;
}

Các hàm liên quan

countĐếm số lượng phần tử có key bằng với giá trị key cho trước trong std::map
lower_boundTrả về một iterator trỏ đến phần tử đầu tiên trong std::mapkey lớn hơn hoặc bằng giá trị key cho trước
upper_boundTrả về một iterator trỏ đến phần tử đầu tiên trong std::mapkey lớn hơn giá trị key cho trước
[]Truy cập phần tử có key tương ứng trong std::map
findTìm kiếm một phần tử có key bằng với giá trị key cho trước trong std::map