从另一个字符串向量创建一个对象向量
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);
}
};
- 不需要引用源向量
假设我有一个包含名称的字符串向量,现在我想从这个向量名称创建一个运动员 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);
}
};
- 不需要引用源向量