考虑对象的C ++向量容器,包含字段a和时间。我们想要找到当前时间之后发生的容器中的第一个项目(让我们将其称为项目N),然后从字段a中具有的字段a开始的第一个项目开始迭代容器某个值(基本上,从[N-1,inf])。假设找不到该属性,我们将对整个列表执行第二次迭代。
以下代码是否有效? (在该示例中,我们希望找到具有> = 5的最新项目)。 有更好的方法吗?
myVectorType::const_iterator cBegin = myVectorObj.begin();
myVectorType::const_iterator cEnd = myVectorObj.end();
// Find the most recent item with a >= 5
for (myVectorObj::const_iterator iter = cBegin; iter != cEnd; ++iter)
{
if ((*iter).time >= currentTime)
{
// Found an item that is in the future - we should have determined the location of the most
// recent item with the propery we're looking for.
break;
}
else if ((*iter).a >= 5)
{
// Past item with a >= 5. Save the location.
cBegin = iter;
}
}
// Iterate over the container, beginning at the most recent item with a >= 5, if it was found.
for (; cBegin != cEnd; ++cBegin)
{
dostuff();
}
答案 0 :(得分:0)
两步过程。首先,在当前时间之后找到该字段:
auto afterCurrent = std::find_if(myVectorObj.begin(), myVectorObj.end(), [=](const Field& field){
return field.time >= currentTime;
});
然后,使用> = 5
找到元素BEFOREafterCurrent
auto reverse = myVectorType::const_reverse_iterator(afterCurrent);
auto atLeast5_rev = std::find_if(reverse, myVectorType.rend(), [=](const Field& field) {
return field.a >= 5;
});
// convert back to forward iterator
auto atLeast5 = --(atLeast5_rev.base());
然后从atLeast5
迭代到结尾。