C++ STL中是否有创建对象的函数对象?
考虑以下类别:C++ STL中是否有创建对象的函数对象?,c++,stl,functional-programming,C++,Stl,Functional Programming,考虑以下类别: class Person { public: // I don't want any "char *" to be converted to Person implicitly! explicit Person( const char * name ) : name_(name) {}; private: std::string name_; }; 也考虑以下数组的char *数据: char STUDENT_NAMES[][20] = { "
class Person {
public:
// I don't want any "char *" to be converted to Person implicitly!
explicit Person( const char * name ) : name_(name) {};
private:
std::string name_;
};
也考虑以下数组的char *数据:
char STUDENT_NAMES[][20] = {
"Bart",
"Liza",
"Maggie"
};
现在,我想根据这个数组创建std::list of Person。
我所能发明的就是将std::transform算法与手写体结合使用
功能对象:
struct CreatePerson : public std::unary_function<const char*,Person> {
Person operator() (const char * name) const {
return Person(name);
};
};
// ...
std::list<Person> students;
std::transform(
&STUDENT_NAMES[ 0 ],
&(STUDENT_NAMES[ sizeof(STUDENT_NAMES)/sizeof(STUDENT_NAMES[0]) ]),
front_inserter(students),
CreatePerson() );
// ...
struct CreatePerson:public std::一元函数{
Person运算符()(常量字符*名称)常量{
返回人(姓名);
};
};
// ...
学生名单;
std::transform(
&学生姓名[0],
&(学生姓名[sizeof(学生姓名)/sizeof(学生姓名[0]),
前插入器(学生),
CreatePerson());
// ...
有没有更短和/或更清晰的方法?也许是一些标准
功能对象或适配器?您可以按以下方式使用:
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/construct.hpp>
#include <string>
#include <iterator>
#include <algorithm>
#include <list>
struct person {
explicit person(char const *name)
:name(name) { }
private:
std::string name;
};
int main() {
char names[][20] = {
"Michael", "litb"
};
std::list<person> v;
std::transform(names, names + 2, std::front_inserter(v),
boost::lambda::constructor<person>());
}
#包括
#包括
#包括
#包括
#包括
#包括
结构人{
显式人员(字符常量*名称)
:name(name){}
私人:
std::字符串名;
};
int main(){
字符名称[][20]={
“迈克尔”,“利特”
};
标准:清单五;
std::transform(名称,名称+2,std::前端插入器(v),
boost::lambda::constructor());
}
我不认为有这样的方式与标准C++库。 没有太多帮助,但是没有宏的标准元素吗
sizeof(STUDENT_NAMES)/sizeof(STUDENT_NAMES[0])
快速搜索没有找到它,但我觉得我使用的每个实现都有它
我唯一的另一个建议是将CreatePerson转换为模板——这样,如果您再次需要它,您只需执行CreateObj或类似操作。我将编写一个方法/函数,如:
convert(const char*[] names, std::list<Person>&);
convert(const char*[]名称,std::list&);
为什么不做一个简单的转换呢?也许我没抓住重点
m2c类的构造函数是一个转换函数。您不需要变换:只需插入即可。看一看
我希望这个数组的计算现在终于完成了。“忽略我的哑巴”在我的回答中提到了关于什么产生了什么类型的问题。同样,早上的数组hax伤害了我的大脑:)然而,我仍然建议你制作
STUDENT_name
achar const*NAMES[]={“Bart”、“Lisa”、…}代码>-这样它就不能再超过20个字符的限制了。但是我不知道你的代码库。你这样做有充分的理由吗?你的解决方案看起来不错,谢谢!关于数组大小。谢谢你的建议,但这不是问题的关键。我的例子断章取义,为了便于理解而重写。:)@litb:const char names[][20]不会对数据进行重新定位,因此允许数据位于只读内存(如EPROM)中。OTHO,即使const char*names[]也需要重新定位(这是一个指针数组,这些指针需要重新定位):#包括std::transform(boost::begin(names),boost::end(names),…:)重点在于重用标准库中定义的迭代代码。“algorithm”(算法)标题包含大量用于非常常见的迭代任务的有用函数,这些函数不限于列表、向量、数组,而是使用“迭代器”。@xtofl:是的,我同意。我的观点是,这种情况下的附加值并不明显,因为在给定的示例中,您必须在Person类范围之外编写一元函数,这只是为了应用标准变换算法。您的解决方案(使用构造器)非常好,而且在那里转换的使用看起来很干净。但是写一个一元数只是为了使用转换…不,不是。请注意,我的构造函数是显式的。使用static create()的第二个示例确实可以很好地工作,但它是我采用的唯一好看的示例。您刚刚将功能从函子移到了静态方法。无论如何,谢谢你。我想看到的是一种直接创建对象的方法。现在在我看来,STL中没有这样的能力。你是完全正确的。你要求了一个更好的方法——不仅仅是一点点:你不需要额外的函子。
std::list<Person> ps( NAMES, NAMES+sizeof(NAMES)/sizeof(NAMES[0]) );
struct Person {
static Person create( const char* name );
....
};
std::transform( NAMES, NAMES+sizeof(NAMES)/sizeof(NAMES[0], front_inserter( ps ),
&Person::create );