从另一个字符串向量创建一个对象向量

Create a vector of object from another vector of string

假设我有一个包含名称的字符串向量,现在我想从这个向量名称创建一个运动员 class 的向量。那么如何使用循环创建一个 without 呢?

这是我的 Athlete class:

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

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

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

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

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

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

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,这就是定义:

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);
    }
};

- 不需要引用源向量