2017-07-17 11 views
-1

fooインスタンスのベクトルを文字列に変換しようとしていますが、std :: transformで致命的なエラーが発生しています。それはラインで​​でtranform実装の *__result = __unary_op(*_first)を停止してデバッグすることは、その後キャッチテストフレームワークのFatalConditionHandlerになりながらstd :: transformの致命的なエラーC++

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

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

[1] 
    [name] = Joseph 
    [size] = 3413 

コード:

セイdataは、次の値があります。私はテストとstd :: transformの両方をキャッチするのが初めてです。問題の原因とその解決方法を説明できる人はいますか?どうもありがとう!

+0

これは 'result << server << ...'でしょうか? – BoBTFish

+1

'std :: vector :: reserve'はあなたが思っていることをしません。 'resize'はより正確ですが、それでもあなたはそれを避けたいかもしれません。 – 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(); 

、私は思いますおそらくコードは多少異なった構造になっています。

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

それは、しかし、全くstringstream itermediariesせずにこれをやって検討する価値があるかもしれません。そして、あなたの中にラムダ変換単純ではなくなった...

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

:私のような何かを追加したいです。この場合、実際には文字列の連結が必要になります。そのためにはかなりのオーバーヘッドがかかります。

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

次にラムダ体は次のようになります。

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

、短い単純、そしてほぼ確実に速く。

+0

ありがとうございました!!!これは本当に役に立ちます! – sabanana