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谢谢你的评论,我很可能错过了角逐!我一到家就会检查你的提案。干杯!