【问题标题】:C++: Map, previous item of a keyC ++:映射,键的前一项
【发布时间】:2013-12-11 12:01:09
【问题描述】:

我有这张地图: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--; 这不是好的编程。我能怎么做?谢谢大家。

【问题讨论】:

  • 递减迭代器没有什么问题(尽管在某些较旧的编译器上预递减可能在微观上更快,最好检查itlow->first而不是items.count())。只要确保你没有递减超过前面。
  • 好的,谢谢。我不确定那个项目——能做到。我确定该项目不会减少超过第一个项目,因为我不允许插入小于 1 的值。

标签: c++ dictionary lower-bound


【解决方案1】:

您只需要检查您的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;
  }
}

【讨论】:

  • 如果items 为空并且您查找 0,这似乎不起作用。然后看起来find() 实际上在地图中找到了一个元素(并返回 0)。跨度>
  • 怎么样:if (it == items.end() || it-&gt;first != value) { if (it == items.begin()) { /* not found, set empty */ } else { --it; /* found prev */ } } else { /* found exact */ }?
  • @Vegard 感谢您的评论,我很可能错过了极端案例!我一回到家就检查你的建议。干杯!
【解决方案2】:

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


这是可行的,因为map.upper_bound 返回一个迭代器,该迭代器指向第一个大于 的元素,而不是key 或当这样的元素不存在时的结束迭代器。此外,OP 解释说map 不为空,key 大于map 中的第一个元素。如果不满足后一个条件,则应单独处理upper_bound返回map.begin()的情况。

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2011-11-26
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多