C++ C++;:映射,键的上一项

C++ C++;:映射,键的上一项,c++,dictionary,lower-bound,C++,Dictionary,Lower Bound,我有这个地图:地图项目。 给定一个键,我希望此映射返回对应于键的项(如果存在),否则该映射返回键立即小于给定键的项。 例如,如果我有: items[0]=0; items[6]=10; items[15]=18; items[20]=22; 对于key=15,我希望map返回值为18的项,否则对于key=9,我希望map返回值为10的项 我还没有找到这个案例的函数。但我试着这样做: itlow=items.lower_bound(key); if(!items.count(ke

我有这个地图:
地图项目
。 给定一个键,我希望此映射返回对应于键的项(如果存在),否则该映射返回键立即小于给定键的项。 例如,如果我有:

  items[0]=0;
  items[6]=10;
  items[15]=18;
  items[20]=22;
对于key=15,我希望map返回值为18的项,否则对于key=9,我希望map返回值为10的项

我还没有找到这个案例的函数。但我试着这样做:

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

这是我想要的,在映射中输入一个最小值
items[0]=0作为默认值,但我知道
itlow--编程不好。我该怎么办?谢谢大家

您只需检查您的
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;
  }
}
#包括
#包括
使用名称空间std;
常量迭代器查找(常量映射和项,int值)
{
自动itlow=项目。下限(值);
如果(itlow->first==值)
把它放在下面;
else if(itlow!=items.cbegin())
返回--itlow;
其他的
返回items.cend();
}
int main()
{
地图项目;
项目[2]=0;
项目[6]=10;
项目[15]=18;
项目[20]=22;
自动i=查找(项目,0);
如果(i!=items.cend())
{

减少迭代器不会有什么错(尽管在某些较旧的编译器上,从微观角度看,预减量可能更快,最好先检查
itlow->first
,而不是执行
items.count()
)。只需确保不从前面递减。好的,谢谢。我不确定该项--是否可以。我确定该项不会在第一项之后递减,因为我不允许插入小于1的值。如果
items
为空,并且您查找0,则这似乎不起作用。然后,它将看起来像
find()
在映射中实际找到一个元素(并返回0)。如何:
if(it==items.end()| it->first!=value){if(it==items.begin()){/*未找到,设为空*/}否则{it;/*找到上一个*/}否则{/*找到精确的*/}
?@Vegard谢谢你的评论,我很可能错过了角逐!我一到家就会检查你的提案。干杯!