【问题标题】:Segfault on using transform on a vector of pointers to an abstract class在指向抽象类的指针向量上使用变换的段错误
【发布时间】:2010-07-26 15:13:43
【问题描述】:

我在以下代码中遇到了段错误:

我有一个带有方法的抽象类A

virtual bool Ok() const;

现在,我有以下向量

std::vector<A*> v;

填充了几个指向现有子对象的指针。我想将Ok()方法的结果累加如下:

std::vector<bool> results;
std::transform(v.begin(), v.end(), results.begin(), std::mem_fun(&A::Ok));
std::accumulate(results.begin(), results.end(), true, std::logical_and<bool>());

不幸的是,我总是在第二行得到一个段错误,我不明白为什么。用标准 C++ 循环替换转换调用修复了段错误。有什么想法吗?

【问题讨论】:

    标签: c++ transform


    【解决方案1】:

    results 向量为空,transform 不知道您希望将结果推送到它而不是覆盖现有序列。

    要么用正确的大小初始化results 向量:

    std::vector<bool> results(v.size());
    

    或使用“后插入”迭代器将结果推送到空向量:

    std::transform(v.begin(), v.end(), std::back_inserter(results), std::mem_fun(&A::Ok));
    

    【讨论】:

    • 谢谢。事实证明,我自己的解释非常混乱和错误。当然,你完全正确!
    • 我发现了如何纠正我自己的解释。当然,一旦我可以这样做,我会将您的答案标记为正确的答案。
    【解决方案2】:

    这可能很愚蠢,但我会直接回答我自己的问题。在点击“发布您的问题”之前不久,我发现了问题,并认为,由于我已经输入了所有内容,我可能还会发布答案,以便其他人可以从中受益:

    答案是,results 向量是空的,因此插入results.begin() 是一件非常愚蠢的事情。相反,使用std::back_inserter(results) 一切正常!

    【讨论】:

    • 调整结果大小并使用begin() 也可以。请记住,vector&lt;bool&gt; 有很多问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多