C++ primer 5ed equal_range для ассоциативных контейнеров
В C++ prime 5 Ред. Глава 11. Ассоциативные контейнеры. "Таблица 11.7. Операции по поиску элементов в ассоциативном контейнере":
Говорят: "c.equal_range(k)
возвращает пару итераторов, обозначающих элементы с ключом k. если k отсутствует, оба члена являются c.end()".
set<int> si{ 5, 7, 23, 16, 81, 24, 10};
auto it = si.equal_range(13);
cout << *it.first << " " << *it.second << endl; // 16 16
- Но как вы можете видеть выше
13
не найден, но возвращаетpair
итераторов для элементов16, 16
?!
1 ответ
При запуске этой программы она работает по назначению: возвращает конечные итераторы.
int main (int argc, char** argv) {
std::set<int> si{ 5, 7, 23, 16, 81, 24, 10};
auto it = si.equal_range(99);
if(it.first == std::end(si)) {
std::cout << "Element not found." << std::endl;
}
else {
std::cout << *it.first << ", " << *it.second << std::endl;
}
return 0;
}
Но, если бы я проверял 13, я бы вернулся 16, 16
.
Согласно cppreference.com
Returns a range containing all elements with the given key in the container. The range is defined by two iterators, one pointing to the first element that is not less than key and another pointing to the first element greater than key. Alternatively, the first iterator may be obtained with lower_bound(), and the second with upper_bound().
16 как раз оказывается первым элементом, который не меньше, а также больше 13 в вашем примере.