我将值存储在std :: map
中我在地图中找到两个值,我想在第一个到最后一个项目之间进行迭代 - 但是< =运算符没有实现,所以我不能像这样做一些事情:
void foobar(const DatedRecordset& recs, const double startstamp, const double endtstamp)
{
DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp), end_iter = recs.lower_bound(endtstamp);
// Can't do this .... (<= not defined)
//for (DatedRecordsetConstIter cit = start_iter; cit <= end_iter; cit++ )
/ So have to resort to a hack like this:
for (DatedRecordsetConstIter cit = start_iter; cit != recs.end(); cit++ ) {
if ((*cit).first <= (*end_iter).first){
//do something;
}
else
break;
}
}
}
是否有更优雅的方法在两个已知的迭代器之间进行迭代?
答案 0 :(得分:2)
使用!=
代替<=
,它会按您的要求执行。
void foobar(const DatedRecordset& recs, const double startstamp, const double endtstamp)
{
DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp),
end_iter = recs.upper_bound(endtstamp);
for (DatedRecordsetConstIter cit = start_iter; cit != end_iter; ++cit) {
}
}
答案 1 :(得分:1)
<=
没有std::map<>::iterator
运算符,但在!=
上使用end_iter
基本上应该做同样的事情。如果要在迭代中包含结束迭代器本身,请使用类似do
循环的内容在最后执行!=
测试。
答案 2 :(得分:1)
struct ManipulateMatchingPairs {
template<class K, class V>
void operator()(const std::pair<K,V>& p) const {
// do with p.second as you please here.
}
};
// ...
std::for_each(start_iter, end_iter, ManipulateMatchingPairs());
答案 3 :(得分:0)
STL for_each算法也不会在循环中包含结束迭代器。你总是可以增加end_iter,只需使用for_each,这样就可以包含它。
void foobar(const DatedRecordset& recs,
const double startstamp,
const double endtstamp)
{
DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp);
DatedRecordsetConstIter end_iter = recs.lower_bound(endtstamp);
if(end_iter != recs.end())
++end_iter;
for_each(start_iter, end_iter, []()
{
//do something inside the lambda.
});
}
这样的事可能吗?我没有给它编译检查......
答案 4 :(得分:0)
您必须使用!=
运算符。我相信这是因为std :: map在内存中不一定是连续的(所以<=
运算符没有多大意义,而std::vector
会这样),我可能错了,但是
答案 5 :(得分:0)
如果要在循环中包含结束迭代器,可以递增结束条件迭代器++end_iter
。在此之后,cit != end_iter
的循环与您在增加之前与cit <= end_iter
打算相同。