在进行这种lesson编码时,我遇到了一些奇怪的行为。
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标志进行编译。 预先感谢。
答案 0 :(得分: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_if
在B
中有足够的空间,则必须相互补充。它们不会-都为false
返回0
。
但是主要的问题是,在我们的案例中(解决了上述问题之后)std::remove_copy_if
返回了B.end()
,这与A.begin()
不兼容。我也建议弄清楚这一点,因为我也感到困惑。
std::remove_copy_if
不会修改输入范围,只有std::copy_if
带有否定谓词-似乎是另一个误解。
似乎您只是想对A
进行分区,同时使元素保持顺序。之后,对所有三个向量进行排序,这意味着您可以首先对A
的{{1}} / std::lower_bound
进行排序,然后继续使用算法,而无需使用{{1} }和std::upper_bound
-使用一些迭代器算法而不是建立索引。