说我有这样的数组:
int arr [9] = {2,1,5,8,9,4,10,15,20}
如何将数组拆分为某个值阈值?所以说int 8
是我们的分裂值,最终结果将是两个独立的数组(或者如果你想给出一个镜头,则是一个二维数组),在这个例子中是arr1 [4] = {1,2,4,5}
和{{1} }。 arr2 [5] = {8,9,10,15,20}
将arr1
中arr
以下的所有值存储在8
以及arr2
存储arr
中8
及以上的所有值。
我无法找到足够的文档或示例,我认为数组操作和拆分值得举例说明。
答案 0 :(得分:3)
Use std::partition, or if you want to maintain the relative order and not sort the data, std::stable_partition.
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
int pivot = 8;
int arr [9] = {2,1,5,8,9,4,10,15,20};
// get partition point
int *pt = std::stable_partition(arr, std::end(arr), [&](int n) {return n < pivot;});
// create two vectors consisting of left and right hand side
// of partition
std::vector<int> a1(arr, pt);
std::vector<int> a2(pt, std::end(arr));
// output results
for (auto& i : a1)
std::cout << i << " ";
std::cout << '\n';
for (auto& i : a2)
std::cout << i << " ";
}
答案 1 :(得分:2)
如果您可以使用C ++ 11,那么这是使用标准库的一种方式:
使用partition_point :(编辑链接中的示例)
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::array<int, 9> v = {2,1,5,8,9,4,10,15,20};
auto is_lower_than_8 = [](int i){ return i < 8; };
std::partition(v.begin(), v.end(), is_lower_than_8 );
auto p = std::partition_point(v.begin(), v.end(), is_lower_than_8 );
std::cout << "Before partition:\n ";
std::vector<int> p1(v.begin(), p);
std::sort(p1.begin(), p1.end());
std::copy(p1.begin(), p1.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\nAfter partition:\n ";
std::vector<int> p2(p, v.end());
std::sort(p2.begin(), p2.end());
std::copy(p2.begin(), p2.end(), std::ostream_iterator<int>(std::cout, " "));
}
打印哪些:
Before partition:
1 2 4 5
After partition:
8 9 10 15 20
答案 2 :(得分:0)
我正在开发一个带循环的解决方案。这是一个正在进行的工作。让我知道你的想法。
void splitarr(int arr[], int length) {
int accu = 0;
int accu2 = 0;
int splitter = rand() % 20;
for (int i = 0; i < length; i++) {
if (i != splitter) {
accu++;
}
}
int arr1[accu];
for (int i = 0; i < length; i++) {
if (i != splitter) {
arr1[i] = i;
}
}
for (int i = 0; i < length; i++) {
if (i == splitter) {
accu2++;
}
}
int arr2[accu2];
for (int i = 0; i < length; i++) {
if (i == splitter) {
arr2[i] = i;
}
}
}