我正在尝试将foo实例的向量转换为字符串,但我在std :: transform上遇到致命错误。
说data
具有以下值:
[0]
[name] = John
[size] = 3423
[1]
[name] = Joseph
[size] = 3413
代码:
struct foo {
foo(std::string n, size_t s)
: name(std::move(n)),
size(s)
{
}
std::string name;
size_t size;
};
std::string server = "1";
std::vector<std::string> output;
output.reserve(static_cast<unsigned_long>(std::distance(std::begin(data), std::end(data))));
std::transform(std::begin(data),
std::end(data),
std::begin(output),
[&, this](foo const& item){
std::ostringstream result;
data << server << ","
<< item.name << ","
<< item.size << ";";
return result.str();
});
调试时停在线路上
*__result = __unary_op(*_first)
中tranform
实现的stl_algo.h
然后转到catch测试框架的FatalConditionHandler。我是捕捉测试和std :: transform的新手。有人可以解释可能导致问题的原因以及解决方法吗?非常感谢!
答案 0 :(得分:1)
您已在output
中保留了空格,但您已将其大小保留为零。
然后继续通过其begin
迭代器进行写操作,就像它有空间来保存数据一样。
然后一切都变得“繁荣”。
请考虑使用std:begin(output)
作为目标迭代器,而不是通过std::back_inserter(output)
进行书写。
你还有另一个问题:在你的lambda中,你有:
std::ostringstream result;
data << server << ","
<< item.name << ","
<< item.size << ";";
return result.str();
这看起来是一个相当明显的错误 - 你无疑是有意的:
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;
}
};
...然后变换中的lambda变得相当简单:
std::ostringstream result;
result << server << "," item;
return result.str();
然而,在没有stringstream
itermediaries的情况下这样做可能值得考虑。在这种情况下,你真的只需要字符串连接,并且它们会产生相当多的开销。
struct foo {
// ...
std::string to_string() {
return name + "," + size;
}
};
然后lambda身体变成:
return server + "," + item.to_string();
更短,更简单,几乎肯定更快。