断言该向量由值x分区

时间:2017-03-16 08:26:27

标签: c++ vector

代码段

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

3 个答案:

答案 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进行测试。