实现一个在集合上迭代的模板函数

Implement a template function that iterates over collection

本文关键字:迭代 函数 集合 一个 实现      更新时间:2023-10-16

我如何实现这个模板函数,该函数将来通过迭代提供的集合来选择快速车辆

void select(T test, std::list<const Vehicle*>& vehicles):atemplate函数,迭代存储在m_vehicles中的车辆,并将所有车辆添加到第二个参数则CCD_ 3为真。第一个参数(test(可以是lambda表达式、指向函数的指针或与原型:
bool func(const sdds::Vehicle*);

这是将被调用的lambda表达式之一,以便仅选择快速车辆

auto fastVehicles = [&](const sdds::Vehicle* veh_fast){
bool value = false;

if (veh_fast->topSpeed() > 300){
value = true;
}

return value;
};

我的函数不起作用,但是,这是我迄今为止尝试过的类:

class Autoshop {

std::vector<Vehicle*> m_vehicles;

public:

Autoshop();
~Autoshop();
Autoshop& operator +=(Vehicle* theVehicle);
void display(std::ostream& out) const;

template<typename T>
void select(T test, std::list<const Vehicle*>& vehicles){
bool c = true;
if (test == c) {
for (auto it = m_vehicles.begin(); it != m_vehicles.end(); ++it) {
vehicles.push_back(*it);

}
}
}
};

错误:

错误:对'(main(int,char**(::<lambda(常量sdds::车辆*(>((('46|if(test((==c({|~~~^~w6_p2.cpp:80:29:注意:候选者:'main(int,char**(::<lambda(const sdds::Vehicle*(>'80|
auto-fastVehicles=[&](const sdds::Vehicle*veh_fast({|^w6_p2.cpp:80:29:注意:候选者需要1个参数,提供0个

您必须测试车辆,因此您必须将车辆传递给测试功能。

因此,对test的调用应该在循环内部,而不是在循环外部,并且您将去引用迭代器传递给它

for (auto it = m_vehicles.begin(); it != m_vehicles.end(); ++it)
if (test(*it)) // perform the test on a vehicle
vehicles.push_back(*it);

基于距离的循环可能更容易理解

for (auto vp : m_vehicles)
if (test(vp)) // perform the test on a vehicle
vehicles.push_back(vp);

或者按照以上注释中的建议使用std::copy_if