2017-07-17 107 views
-1

我试图将foo实例的向量转换为字符串,但我在std :: transform上有致命错误。致命错误在std :: transform C++

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(); 
     }); 

在调试停止在该行的​​tranform实施 *__result = __unary_op(*_first)然后去追赶测试框架的FatalConditionHandler。我对catch测试和std :: transform都很陌生。有人可以解释什么可能导致问题以及如何解决问题?非常感谢!

+0

应该是'result << server << ...'? – BoBTFish

+1

'std :: vector :: reserve'不会做你认为它的功能。 “调整大小”更准确,但即使如此,您可能也想避免这种情况。 – AndyG

回答

1

您已预留空间output,但您已将其大小设置为零。

然后,您继续编写它的begin迭代器,就好像它有空间保存数据。

然后一切都会“繁荣”。

而不是通过std:begin(output)写入,请考虑使用std::back_inserter(output)作为目标迭代器。

你也有另外一个问题:你的拉姆达里面,你有:

 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; 
    } 
}; 

...然后在您的拉姆达变换变得相当简单:

std::ostringstream result; 
result << server << "," item; 
return result.str(); 

它可能,但是,是值得考虑的,而不stringstream itermediaries都这样做。在这种情况下,你真的只需要字符串连接,并且它们会带来相当多的开销。

struct foo { 
// ... 
    std::string to_string() { 
     return name + "," + size; 
    } 
}; 

然后拉姆达身体变:

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

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

+0

非常感谢!这真的很有帮助! – sabanana