gpt4 book ai didi

c++ - 从另一个字符串 vector 创建一个对象 vector

转载 作者:行者123 更新时间:2023-11-28 05:57:32 25 4
gpt4 key购买 nike

假设我有一个包含名称的字符串 vector ,现在我想根据这个 vector 名称创建一个 Athlete 类的 vector 。那么如何创建一个使用循环呢?

这是我的Athlete 类:

class Athlete{
public:
Athlete(string name, int number);

private:
string name;
int number, time;
};

这是我使用循环的尝试,假设 vector 名称已经包含一些元素:

vector<string> names;
vector<Athlete> athletes;

for(auto i = names.begin(); i != names.end(); i++)
athletes.push_back(Athlete(*i, i - names.begin() + 1));

但现在我想使用循环来创建 vector 运动员。起初,我以为我会使用 generate 但函数对象不能引用 vector 名称。那么我应该使用哪个函数呢?

最佳答案

Lambda 函数

技术上仍然是一个循环,但更丑陋了很多倍:

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

using std::cout;
using std::endl;

class Athlete {
public:
Athlete(std::string name, int number) {};

private:
std::string name;
int number, time;
};

int main()
{
std::vector<std::string> names;
std::vector<Athlete> athletes;

std::transform(names.begin(), names.end(), std::back_inserter(athletes),
[&names](std::string const& name)
{
return Athlete(name, &name - &names.front() + 1);
});
}

基于范围的for循环

有趣,因为循环可能是:

for(auto const& name : names)
athletes.emplace_back(name, &name - &names.front() + 1);

函数对象#1

但是因为你想要一个仿函数类,所以这是定义:

class StringToAthleteFunct
{
std::vector<std::string> const& names;

public:

StringToAthleteFunct(std::vector<std::string> const& names) :
names(names)
{
}

Athlete operator()(std::string const& name) const
{
return Athlete(name, &name - &names.front() + 1);
}
};

这是用法:

std::transform(names.begin(), names.end(), std::back_inserter(athletes),
StringToAthleteFunct(names));

函数对象#2

实际上,这个更好:

class StringToAthleteFunct
{
int index;

public:
StringToAthleteFunct() : index(0) { }

Athlete operator()(std::string const& name)
{
return Athlete(name, ++index);
}
};

- 不需要引用源 vector

关于c++ - 从另一个字符串 vector 创建一个对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848107/

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