将数组拆分为特定值C ++

时间:2017-03-02 23:06:46

标签: c++ arrays

说我有这样的数组:

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}arr1arr以下的所有值存储在8以及arr2存储arr8及以上的所有值。

我无法找到足够的文档或示例,我认为数组操作和拆分值得举例说明。

3 个答案:

答案 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 << " ";
    }

Live Example

答案 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;
        }

    }
}