C++11 如何使用 lambda 和高阶函数将向量转换为不同类型的向量
C++11 How to use lambda and higher order functions to transform a vector to a vector of different type
有没有办法在 C++11 中使用高阶函数 return 不同类型的向量?我有一个 std::vector<std::string>
并想将其转换为 std::vector<Foo>
这是我自己设备的枚举。
假设我有一个方法Foo toFoo(std::string)
。我试过:
std::vector<Foo> m_Foos = std::for_each(m_Foo_strings.begin(),
m_Foo_strings.end(),
[this](std::string &s){ toFoo(s); } );
也尝试过:
std::vector<Foo> m_Foos = std::transform(m_Foo_strings.begin(),
m_Foo_strings.end(),
m_Foo_strings.begin(),
[this](std::string &s){ toFoo(s); } );
但都无法编译。它抱怨从 std::string 到 Foo 没有定义 operator=。
必须有一种通用的方法来完成我在这里尝试的事情,我错过了什么?
std::transform
不是 return vector
,它应用指定的转换并将结果存储在您传递给它的目标范围内
std::transform(m_Foo_strings.begin(),
m_Foo_strings.end(),
std::back_inserter(m_Foos),
[this](std::string &s){ return toFoo(s); } );
back_inserter
构造一个 back_insert_iterator
,当 transform
将调用结果分配给 lambda 时,它将调用 vector::push_back
向 m_Foos
添加元素。
std::vector<Foo> m_Foos;
std::for_each(m_Foo_strings.begin(),
m_Foo_strings.end(),
[this, &m_Foos](std::string &s){ m_Foos.push_back(toFoo(s)); } );
我会使用基于范围的 for 循环。如果您从 begin
迭代到 end
,这会起作用,但如果您只想处理一个子集,则需要使用 for_each
或 transform
。
std::vector<Foo> m_Foos;
for (const auto& s : m_Foo_strings) {
m_Foos.push_back(toFoo(s));
}
有没有办法在 C++11 中使用高阶函数 return 不同类型的向量?我有一个 std::vector<std::string>
并想将其转换为 std::vector<Foo>
这是我自己设备的枚举。
假设我有一个方法Foo toFoo(std::string)
。我试过:
std::vector<Foo> m_Foos = std::for_each(m_Foo_strings.begin(),
m_Foo_strings.end(),
[this](std::string &s){ toFoo(s); } );
也尝试过:
std::vector<Foo> m_Foos = std::transform(m_Foo_strings.begin(),
m_Foo_strings.end(),
m_Foo_strings.begin(),
[this](std::string &s){ toFoo(s); } );
但都无法编译。它抱怨从 std::string 到 Foo 没有定义 operator=。
必须有一种通用的方法来完成我在这里尝试的事情,我错过了什么?
std::transform
不是 return vector
,它应用指定的转换并将结果存储在您传递给它的目标范围内
std::transform(m_Foo_strings.begin(),
m_Foo_strings.end(),
std::back_inserter(m_Foos),
[this](std::string &s){ return toFoo(s); } );
back_inserter
构造一个 back_insert_iterator
,当 transform
将调用结果分配给 lambda 时,它将调用 vector::push_back
向 m_Foos
添加元素。
std::vector<Foo> m_Foos;
std::for_each(m_Foo_strings.begin(),
m_Foo_strings.end(),
[this, &m_Foos](std::string &s){ m_Foos.push_back(toFoo(s)); } );
我会使用基于范围的 for 循环。如果您从 begin
迭代到 end
,这会起作用,但如果您只想处理一个子集,则需要使用 for_each
或 transform
。
std::vector<Foo> m_Foos;
for (const auto& s : m_Foo_strings) {
m_Foos.push_back(toFoo(s));
}