8

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

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

对于 key=15,我希望地图返回值为 18 的项目,否则对于 key=9,我希望地图返回值为 10 的项目。

我还没有找到适合这种情况的功能。但我尝试过这种方式:

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

这可以按我的意愿工作,在地图中输入一个最小值items[0]=0作为默认值,但我知道itlow--;这不是好的编程。我能怎么做?谢谢大家。

4

2 回答 2

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;
  }
}
于 2013-11-26T11:27:14.110 回答
0

试试这个 auto it = prev(map.upper_bound(key));


这是有效的,因为当这样的元素不存在时,返回一个迭代器,该迭代器指向大于或过去的迭代map.upper_bound器的第一个元素key此外,OP 解释说它 map不是空key的,并且大于map. 如果不满足后一个条件,则应单独处理upper_bound退货的情况map.begin()

于 2021-08-28T16:34:17.503 回答