#包括<iostream> #包含<内存> #包括<功能> #包含<矢量> 结构人员 { std::string名称; int年龄; }; 类PersonActions { std::function<void(Person*)>actions=[](Person*设备){};// 默认为No-op 公众: void Append(std::function操作) { auto-oldAction=动作; actions=[oldAction,action](个人*设备){ oldAction(设备); 动作(装置); }; } void执行(个人*设备) { 动作(装置); } }; 模板<类型名T> 类PersonActionsBuilder { 受保护的: PersonActions动作; 公众: 执行自定义(std::function<void(Person*)>action)(&E) { 行动。 追加(动作); return*((T*)this); } T&AppendName(标准::字符串值){ 行动。 附加([值](个人*设备){ 设备->Name.append(value); }); 返回*((T*)this); } 打印(&P) { 行动。 附加([](个人*设备){ 标准::cout<<“-名称:”<<设备->名称<<std::endl; 标准::cout<<“-年龄:”<<设备->年龄<<std::endl; }); return*((T*)this); } }; 类PersonQuery { std::function<bool(Person*)>谓词=[](Person*device){return true;};// 默认情况下始终为true 公众: void Append(std::function<bool(Person*)>newPredicate) { auto-oldPredicate=this->谓词; this->谓词=[oldPredicate,newPredicate](Person*设备){ return oldPredicate(device)&&newPredicate[device]; }; } bool Match(个人*设备) { 返回谓词(设备); } }; 模板<类型名T> 类PersonQueryBuilder { 受保护的: PersonQuery查询; 公众: T&WhereCustom(std::函数<bool(Person*)>谓词) { 查询。 追加(谓词); return*((T*)this); } T&WhereAge(int value,std::function<bool(int,int)>comparator=std::equal_to<bool>()) { 查询。 附加([值,比较器](Person*设备){ 返回比较器(设备->年龄,值); }); return*((T*)this); } }; 类PersonExecutor { 公众: void Execute(PersonActions和actions,PersonQuery和query,std::vector<Person*>&devices) { for(自动设备:设备) { if(query.Match(设备)) { 行动。 执行(设备); } } } }; 类PersonExecutableQuery:公共PersonQueryBuilder { std::vector<Person*>&devices; 公众: PersonExecutableQuery(std::vector<Person*>和设备):设备(设备) { } 无效执行() { 个人执行人执行人; 执行人。 执行(操作、查询、设备); } }; 整型main(){ std::vector<Person*>个人; persons.push_back(新人物{“John Doe”,30}); persons.push_back(新人物{“Jane Smith”,25}); persons.push_back(新人物{“Alice Johnson”,22}); persons.push_back(新用户{“Bob Brown”,45}); persons.push_back(新人物{“Charlie Davis”,28}); 人员可执行查询(人) .WhereAge(30,标准::greater_equal<int>()) .AppendName(“是”) .执行(); PersonExecutableQuery(人) .WhereAge(30,标准::less<int>()) .AppendName(“无”) .Execute()执行; PersonExecutableQuery(人) .WhereCustom([](人*人){ return person->Name.ends_with(“是”); }) .打印() .执行(); }
2个答案
紧急救援计划
整型main(){ 标准::vector<Person>persons{ {“约翰·多伊”,30}, {“简·史密斯”,25}, {“爱丽丝·约翰逊”,22}, {“鲍勃·布朗”,45岁}, {“查理·戴维斯”,28}, }; for(auto和person:个人) if(人员年龄>=30) 人。 Name+=“是”; for(auto和person:个人) 如果(人员年龄<30) 人。 名称+=“nope”; for(auto和person:个人) if(person.Name.ends_width(“是”)) 标准::cout<<“-姓名:”<<人。 名称<<“\n” <<“-年龄:”<<人。 年龄<<“\n”; }
auto under_30s=persons|std::views::filter(compare_proj(&Person::Age,std::less<>{},30)) std::ranges::for_each(under_30s,append(&Person::Name,“nope”);
标准::范围::copy(个人 |std::views::filter([](auto&p){return p.年龄<30;}) |std::views::transform([](auto&p){p.名称+=“yep”;返回p;}), 标准::ostream_iterator<Person>{std::cout,“\n”});
return*((T*)this);
标准::cout<<“-名称:”<<设备->名称<<std::endl; 标准::cout<<“-年龄:”<<设备->年龄<<std::endl;
在待办事项列表中,……在第一次操作后,无法再进行筛选。
-
\$\开始组\$ 啊,我很久没有用C++编程了,所以我还不知道很多功能。在这种情况下,std::views是我没有遇到过的。 我同意更标准的方法会更好。 我有一个问题,可以在不复制向量的情况下进行转换吗? 我使用的是嵌入式设备,所以我真的需要知道在我做这些事情时发生了什么。 动态内存是所有乐趣和游戏,直到你有有限的资源。 (哦,我当然会使用智能指针,打印只是示例的一部分。) \$\端组\$ – 巴斯·维舍尔 评论 5月23日6:29 -
1 \$\开始组\$ 标准 意见 不要复制集合(但另一方面是访问视图元素 可以 在每次访问时重新计算它们,程序员负责确保元素的存储超过其通过视图的访问)。 每当你看到 看法 以一个名字(例如 标准::字符串视图 ),这告诉您它访问其他东西拥有的存储。 \$\端组\$ – 托比·斯佩特 评论 5月23日8:05 -
1 -
-