-1

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

Saydata具有以下值:

 [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.hcatch 测试框架的 FatalConditionHandler。我对捕获测试和 std::transform 都是新手。有人可以解释可能导致问题的原因以及如何解决吗?非常感谢!

4

1 回答 1

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中间人的情况下这样做。在这种情况下,您真的只需要字符串连接,并且它们会产生相当多的开销来做到这一点。

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

然后 lambda 主体变为:

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

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

于 2017-07-17T14:23:42.313 回答