gpt4 book ai didi

c++ - 如何正确使用std::transform和std::mem_fn?

转载 作者:行者123 更新时间:2023-12-02 10:22:08 27 4
gpt4 key购买 nike

我已经实现了一个C++程序,该程序创建了三个不同的Person对象。这些对象被共享并存储在 vector 中。

函数getVector()const std::vector<std::shared_ptr<Person>>&作为输入并返回std::vector<Person*>。结果 vector 中的每个元素对应于输入 vector 中的相应元素。

该函数将std::transformstd::mem_fn一起使用。

该功能的实现(以及与std::cout的相应调用)不起作用。我认为我以错误的方式(错误的参数等)将std::transformstd::mem_fn一起使用。

我不知道如何使函数getVector()工作。

到目前为止,这是我的源代码:

main.cpp

#include <string>
#include <vector>
#include <memory>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>

struct Person
{
std::string first_name;
std::string last_name;
int age;

Person* getPerson(const std::shared_ptr<Person>& person)
{
Person* p = person.get();
return std::move(p);
}

// Overloaded << operator.
friend std::ostream& operator<<(std::ostream& os, const Person& person)
{
os << person.first_name << ", " << person.last_name << ", " << person.age << "\n";
return os;
}

friend std::string to_string(const Person& obj)
{
std::ostringstream ss;
ss << obj;
return ss.str();
}
};

std::vector<Person*> getVector(const std::vector<std::shared_ptr<Person>>& people);

int main(void)
{
Person person01;
person01.first_name = "Ashley";
person01.last_name = "Graham";
person01.age = 23;

Person person02;
person02.first_name = "Ada";
person02.last_name = "Wong";
person02.age = 45;

Person person03;
person03.first_name = "Leon S.";
person03.last_name = "Kennedy";
person03.age = 26;

std::shared_ptr<Person> ps01 = std::make_shared<Person>(person01);
std::shared_ptr<Person> ps02 = std::make_shared<Person>(person02);
std::shared_ptr<Person> ps03 = std::make_shared<Person>(person03);

std::vector<std::shared_ptr<Person>> peoples;

peoples.emplace_back(std::move(ps01));
peoples.emplace_back(std::move(ps02));
peoples.emplace_back(std::move(ps03));

std::cout << "\nContent of input vector:\n";
std::cout << "====================================\n";
for (auto p : peoples)
{
std::cout << *p;
}
std::cout << "\n";

std::cout << "Calling function 'getVector()'...\n";

std::vector<Person*> result = getVector(peoples);

std::cout << "\nContent of result-vector:\n";
std::cout << "====================================\n";
for (auto r : result)
{
std::cout << *r;
}
std::cout << "\n";

return 0;
}

// std::transform with std::mem_fn.
std::vector<Person*> getVector(const std::vector<std::shared_ptr<Person>>& people)
{
Person* person;
std::shared_ptr<Person> p;
std::vector<Person*> result;

std::transform(people.begin(), people.end(), std::back_inserter(result),
std::bind1st(std::mem_fn(&Person::getPerson), &p));

return result;
}

以下是g++编译器的说明:
g++ -std=c++11 -Wall -Wextra main.cpp -o main

最佳答案

只需使用lambda。它使代码更容易理解,您可以摆脱GetPerson函数。这样做会使您的转换调用看起来像

std::transform(people.begin(), 
people.end(),
std::back_inserter(result),
[](const auto& elem){ return elem.get(); });

关于c++ - 如何正确使用std::transform和std::mem_fn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59617890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com