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_backm_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_eachtransform

std::vector<Foo> m_Foos;
for (const auto& s : m_Foo_strings) {
    m_Foos.push_back(toFoo(s));
}