繁体   English   中英

Sysmalloc:使用向量的断言错误

[英]Sysmalloc: Assertion error using vectors

在上这课时,我遇到了一些奇怪的行为。

int solution(std::vector<int> &A) {
    std::vector<int> B, C;
    B.resize(std::count_if(A.begin(), A.end(), [](int x){return x < 0;}));
    C.resize(A.size() - B.size());
    std::copy(A.begin(), std::remove_copy_if(A.begin(), A.end(), B.begin(), [](int x){return x > 0;}), C.begin());

    std::sort(A.begin(), A.end(), [](int x, int y){return x > y;});
    std::sort(B.begin(), B.end(), [](int x, int y){return x < y;});
    std::sort(C.begin(), C.end(), [](int x, int y){return x > y;});

函数的此部分将向量分成两个向量,第一个为正整数,第二个为负整数。 然后将所有向量按所需顺序排序。

    if (B.size() >= static_cast<size_t>(2)) {
        if (C.size() >= static_cast<size_t>(3)) {
            if (B[0] * B[1] > C[1] * C[2])
                return B[0] * B[1] * C[0];
        } else if(C.size() == static_cast<size_t>(2)) {
            if (B[0] * B[1] > C[0] * C[1])
                return B[0] * B[1] * C[0];
        }
    }
    return A[0] * A[1] * A[2];
}

这部分从输入向量中找出3个元素的最大乘积。

到达return函数后崩溃,我得到一个错误:

a.out: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) &&
old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) &&
((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted

我尝试对其进行调试,我发现在return语句之后,调试器跳至B&C矢量声明,然后又跳至现有的大括号。 我从未见过类似的东西,我想了解它。 我在Linux下使用g ++-7.1,并使用--std = c ++ 14标志进行编译。 提前致谢。

首先,这里的lambda:

B.resize(std::count_if(A.begin(), A.end(), [](int x){return x < 0;}));

和这里:

std::copy(A.begin(),
          std::remove_copy_if(A.begin(), A.end(), B.begin(),
                              [](int x){return x > 0;}),
          C.begin());

如果要确保std::remove_copy_ifB有足够的空间,则必须相互补充。 它们不-都返回0 false

但主要的问题是,在我们的案例中(解决上述问题之后B.end()std::remove_copy_if返回B.end() ),这与A.begin()不兼容。 我也建议弄清楚这个陈述,因为我也感到困惑。

std::remove_copy_if不会修改输入范围,它只是带有否定谓词的std::copy_if似乎是另一个误解。


看起来您只是想对A进行分区,同时使元素保持顺序。 你排序的所有三个矢量之后,这意味着你可以梳理A ,然后再使用std::lower_bound / std::upper_bound0 ,并继续算法不使用BC -使用一些迭代运算,而不是索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM