C ++: карта, предыдущий элемент ключа

У меня есть эта карта: map<int, int > items,
Учитывая ключ, я хочу, чтобы эта карта возвращала элемент, соответствующий ключу, если он присутствует, в противном случае карта возвращает элемент с ключом сразу меньше, чем данный ключ.
Например, если у меня есть:

  items[0]=0;
items[6]=10;
items[15]=18;
items[20]=22;

чем для ключа = 15, я хочу, чтобы карта возвращала элемент со значением 18, в противном случае для ключа = 9 я хочу, чтобы карта возвращала элемент со значением 10.

Я не нашел функцию для этого случая. Но я попробовал так:

itlow=items.lower_bound(key);
if(!items.count(key))
itlow--;
return itlow->second;

Это работает, как я хочу, введя в карту минимальное значение items[0]=0 по умолчанию, но я знаю, что itlow--; это не хорошее программирование. Как я могу сделать? Спасибо всем.

3

Решение

Вам просто нужно проверить, если ваш itlow уже items.begin(), Если это так, на карте нет такого элемента:

itlow=items.lower_bound(key);
if(itlow->first == key)
return itlow->second;
else if(itlow != items.begin())
itlow--;
return itlow->second;
else
throw some_exception();

Вместо исключения вы можете вернуть итератор, а затем вы можете вернуть items.end() если такой элемент не найден

#include <iostream>
#include <map>

using namespace std;map<int, int>::const_iterator find(const map<int, int> &items, int value)
{
auto itlow = items.lower_bound(value);

if(itlow->first == value)
return itlow;
else if(itlow != items.cbegin())
return --itlow;
else
return items.cend();

}

int main()
{
map<int, int> items;
items[2]=0;
items[6]=10;
items[15]=18;
items[20]=22;

auto i = find(items, 0);
if(i != items.cend())
{
cout << i->second << endl;
}
i = find(items, 15);
if(i != items.cend())
{
cout << i->second << endl;
}
i = find(items, 9);
if(i != items.cend())
{
cout << i->second << endl;
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]