multimap upper_bound возвращает путаницу - PullRequest
1 голос
/ 23 марта 2012

У меня есть мультикарта, заполненная парами.Я хочу перебрать диапазон.upper_bound не возвращает итератор, указывающий на элемент, если только он не находит первый элемент, ключ которого больше значения, переданного upper_bound.

Как я могу узнать, не было ли возвращенного значения из upper_bound, потому что нет ничего больше, чемпереданное значение?

Спасибо!

Ответы [ 3 ]

1 голос
/ 23 марта 2012

По крайней мере, если память обслуживает, если upper_bound не находит элемент с ключом больше, чем тот, который вы ему передали, он вернет container.end(). Это хорошо для итерации, поскольку норма для пары итераторов - начало и конец после диапазона, поэтому вы можете без проблем использовать container.end() в качестве конца диапазона.

1 голос
/ 23 марта 2012

upper_bound на самом деле идеально подходит для итерации, потому что он указывает на элемент сразу после конца диапазона - как и end.Таким образом, вы формируете свой цикл аналогично.

for (auto it = mymap.lower_bound(start_key), end = mymap.upper_bound(end_key); it != end; ++it)

Если вам нужен только один ключ, передайте одно и то же значение в lower_bound и upper_bound или используйте equal_range, чтобы получить оба сразу.Если значение вообще не существует на карте, lower_bound и upper_bound будут равны и цикл не будет выполняться.

1 голос
/ 23 марта 2012

См. ссылка и msdn

upper_bound возвращает первый элемент, который больше значения вашего ключа. Если элемента нет, он возвращает то же, что и end()

Так что вы можете просто сравнить это с концом вашей мультикарты

auto it = my_multi_map.upper_bound(some_val);
if (it == my_multi_map.end())
{
  // iterator is pointing past end so no value found
}
...