std :: transform c ++上的致命错误

时间:2017-07-17 14:20:10

标签: c++ std stl-algorithm catch-unit-test

我正在尝试将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的新手。有人可以解释可能导致问题的原因以及解决方法吗?非常感谢!

1 个答案:

答案 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();

更短,更简单,几乎肯定更快。