代码段
std::vector<int> v{ 3, 8, 2, 5, 1, 4, 7, 6};
Partition(v.begin(), v.end(), v.begin());
应重新排列向量v,使得前n个元素小于或等于3,并且以下元素大于3.结果向量应如下所示:
1,2,3,5,8,4,7,6
如何测试Partition是否在断言声明以下内容的断言语句中生成正确的结果:
断言向量的第一部分只包含元素 是 小于或等于x,秒部分仅包含元素 大于x
答案 0 :(得分:5)
感谢委员会中很棒的人,您对分区矢量的要求可以表示为&#34;是分区的矢量?&#34;,它很好地映射到标准std::is_partitioned
算法。生活不美丽吗?
assert(std::is_partitioned(v.begin(), v.end(), [](int e) { return e <= 3; }));
答案 1 :(得分:4)
您想要检查的断言可以重新表述为“在最左边的元素之前严格大于3
的最右边的元素,其小于或等于3
”。
因此,您可以找到这两个元素的位置(请参阅std::find_if documentation,它可以用于普通和反向迭代器),然后在assert
语句中进行比较。检查将在线性时间内工作,并需要恒定的记忆。
答案 2 :(得分:2)
断言矢量的前n个元素小于值x
1,2,3,5,8,4,7,6
结果的初始分区似乎已排序。如果能得到保证,那么最简单的测试就是:
v[n - 1] <= x
如果排序不受保证,那么您可以使用std::all_of
分别测试每个第一个n
元素。
断言向量的第一部分仅包含小于或等于x的元素,而秒部分仅包含大于x的元素
这描述了分区序列。这可以使用std::is_partitioned
进行测试。