C ++使用相同的代码循环遍历对象和指针

大卫

所以我有两个容器

set<Person>
vector<Person*>

有什么方法可以修改以下转换lambda代码,以便可以使用任一容器?

transform(container.begin(), container.end(), back_inserter(data),
          [](const Person* p) { return PairResults(p->getTime(), p->getName()); }
);

现在,我只能让它在向量上工作。

谢谢。

>>解决方案代码在这里

非常感谢安德鲁在这一方面的帮助!

安德鲁

您可以使用一个代理对象,该对象接受指向Person的指针或指向Person的引用,并赋予它们两种指针语义:

实时示例:http//ideone.com/Wk2VMx

#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <string>

struct Person {
    int age;
    std::string name;
};

class PersonProxy {
    public:
        PersonProxy(Person& p)
        : person(&p) {}
        PersonProxy(Person* p)
        : person(p) {}

        Person& operator*() { return *person; }
        Person* operator->() { return person; }

    private:
        Person* person;
};

int main()
{
    std::vector<Person> p1;
    p1.push_back(Person{42, "Bob"});

    Person bill{30, "Bill"};
    std::set<Person*> p2;
    p2.insert(&bill);

    std::vector<int> data;

    auto the_lambda = [](PersonProxy pp) {return pp->age;};

    std::transform(p1.begin(), p1.end(), std::back_inserter(data), the_lambda);
    std::transform(p2.begin(), p2.end(), std::back_inserter(data), the_lambda);

    for (int age : data)
    {
        std::cout << age << "\n";
    }

}

另一种方法是使用仿函数而不是lambda,并定义operator()(Person&)and operator()(Person*),但是上面的方法是提供一种类型,您可以使用该类型编写lambda,并且可以进行来自Person和的隐式转换Person*

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章