如何有效地操作满足给定谓词的向量中的所有项目?

How do I efficiently operate on all items in a vector satisfying a given predicate?

本文关键字:向量 项目 谓词 有效地 操作 满足      更新时间:2023-10-16

对于C++项目,我有一个包含自定义对象的向量,这些对象具有getX()获取其x值的方法。

我有一个方法需要循环访问属性 x 介于startXendX之间的所有元素。

循环这些项目的正确方法是什么?

目前我有:

int startX = 20;
int endX = 30
for(SomeClass x: someObject->getObjects())
{
if(x->getX() > startX && x->getX() < endX)
{
//do something
}
}

它工作正常,但我记得从C++课的旧课程中,有一种方法可以更有效地循环元素。

我记得是这样的:

int startX = 20;
int endX = 30
for(SomeClass x : find(someObject->getObjects(), x, x->getX() > startX && x->getX() < endX)
{      
//do something
}

我只迭代我需要的元素,检查不再在循环内。

编辑: 我将 qt foreach 循环更改为 for 循环,以避免讨论该部分。

您是否正在考虑(前身(std::ranges::filter

int startX = 20;
int endX = 30;
auto inrange = [startX, endX](auto x){ return x->getX() > startX && x->getX() < endX; }
for(SomeClass x: std::ranges::filter(someObject->getObjects(), inrange))
{
//do something
}

假设条件x->getX((>startX && x->getX((<endX是正确的,你可以这样做:>

std::vector<Foo> foo = {foo1, foo2, foo3};
std::vector<Foo> bar;
// copy only positive numbers:
std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), [](Foo x){return x.getX() > startX && x.getX() < endX;} );