-1

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

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 个元素的最大乘积。

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

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 标志进行编译。提前致谢。

4

1 回答 1

2

首先,这里的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. 他们不 - 都返回false0

但主要是,问题是在我们的案例中std::remove_copy_if返回B.end()(在解决了上述问题之后),这与A.begin(). 我建议打破这个陈述,因为我也很困惑。

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


看起来您只是想分区A,同时保持元素有序。之后对所有三个向量进行排序,这意味着您可以A先排序,然后使用std::lower_bound/ std::upper_boundof0并继续算法,而不使用Band C- 使用一些迭代器算法而不是索引。

于 2018-07-26T21:40:35.463 回答