C++ std::transform c+上出现致命错误+;

C++ std::transform c+上出现致命错误+;,c++,std,stl-algorithm,catch-unit-test,C++,Std,Stl Algorithm,Catch Unit Test,我试图将foo实例的向量转换为字符串,但在std::transform上出现了致命错误 假设数据具有以下值: [0] [name] = John [size] = 3423 [1] [name] = Joseph [size] = 3413 代码: structfoo{ foo(标准::字符串n,大小s) :名称(std::move(n)), 尺寸(s) { } std::字符串名; 大小; }; std::string server=“1”; std

我试图将foo实例的向量转换为字符串,但在std::transform上出现了致命错误

假设
数据
具有以下值:

 [0] 
    [name] = John
    [size] = 3423

 [1] 
    [name] = Joseph
    [size] = 3413
代码:

structfoo{
foo(标准::字符串n,大小s)
:名称(std::move(n)),
尺寸(s)
{
}
std::字符串名;
大小;
};
std::string server=“1”;
std::矢量输出;
保留(静态_转换(标准::距离(标准::开始(数据),标准::结束(数据)));
标准::转换(标准::开始(数据),
标准::结束(数据),
开始(输出),
[&,此](食物常量和项目){
std::ostringstream结果;

数据您在
输出中保留了空间,但将其大小保留为零

然后通过它的
begin
迭代器继续写,就像它有空间保存数据一样

然后一切都“繁荣”

<> >而不是通过<代码> STD:Dead(输出)进行编写,考虑使用<代码> STD::BaseXEnter(输出)< /C>作为目标迭代器。

您还有一个问题:在lambda中,您有:

        std::ostringstream result;
        data << server << ","
             << item.name << ","
             << item.size << ";";
        return result.str();
然后lambda主体变成:

return server + "," + item.to_string();

更短、更简单,而且几乎肯定更快。

应该是
结果
std::vector::reserve
不会做你认为它做的事。
resize
更准确,但即使这样,你也可能想要避免。非常感谢!!!这真的很有帮助!
        std::ostringstream result;
        result << server << ","
             << item.name << ","
             << item.size << ";";
        return result.str();
struct foo {
    std::string name;
    size_t size;

    // new addition:
    friend std::ostream &operator<<(std::ostream &os, foo const &f) { 
        return os << f.name << ',' << f.size;
    }
};
std::ostringstream result;
result << server << "," item;
return result.str();
struct foo { 
// ...
    std::string to_string() { 
        return name + "," + size;
    }
};
return server + "," + item.to_string();