2017-03-02 14 views
3

Sagen wir, ich habe ein Array wie folgt aus:Split ein Array auf einem bestimmten Wert C++

int arr [9] = {2,1,5,8,9,4,10,15,20} 

Wie können Sie teilen das Array bei einem bestimmten Wert? Also sagen wir int 8 ist unser Splitting-Wert, das Endergebnis wären zwei separate Arrays (oder ein 2D-Array, wenn Sie dem einen Schuss geben wollen), die in diesem Beispiel arr1 [4] = {1,2,4,5} und arr2 [5] = {8,9,10,15,20} wären. arr1 speichert alle Werte in arr, die unter 8 sind und und arr2 speichert alle Werte in arr, die 8 und höher sind.

Ich konnte nicht genügend Dokumentation oder Beispiele dafür finden und ich denke, Array Manipulation und Aufteilung ist es wert, Beispiele zu haben.

+1

Array-Größen sind Kompilierzeitkonstante. Sie können dies nicht zur Laufzeit ausführen, da es unmöglich ist, die Größe der resultierenden Arrays zur Kompilierzeit zu kennen. Dies kann nur mit dynamischen Zuordnungen ('new int [x]'), mit dynamischen Containern (wie 'std :: vector ') oder wenn Ihr Array ein konstanter Ausdruck ist, durchgeführt werden. In jedem Fall können Sie ein Array nicht "verkleinern". Sie werden mit 'arr' mit einer Größe von 9 'int's verlassen. –

+1

Tricky mit einem Array. Sie teilen sich nicht auf. Sie müssen zwei neue Arrays der richtigen Größe erstellen und das Original auf das neue kopieren. Wenn Sie sich nicht darum kümmern, können Sie das ursprüngliche Array intakt lassen und Indizes oder Zeiger an den Anfang und das Ende weitergeben und es einfach in zwei separaten Arrays anzeigen. – user4581301

+1

Wahrscheinlich, indem Sie ein neues Array erstellen und dann den Schwellenwert suchen. Alle Elemente nach dem Schwellenwert werden * in das neue Array kopiert. –

Antwort

3

Verwenden std::partition, oder wenn Sie die relative Reihenfolge beibehalten möchten und nicht auf die Daten sortieren, 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

2

Wenn Sie 11 verwenden können, C++, dann ist dies eine Möglichkeit, die Standard-Bibliothek verwenden:

Mit einem partition_point: (bearbeitet das Beispiel aus dem Link)

#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, " ")); 
} 

Welche druckt:

Before partition: 
    1 2 4 5 
After partition: 
    8 9 10 15 20 
0

Ich arbeite an einer Lösung mit Schlaufen. Dies ist ein work in progress. Lass mich wissen was du denkst.

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

    } 
} 
+0

Diese Zeile 'int arr1 [accu];' und Zeilen wie diese sind nicht gültig C++. Arrays müssen mit einer Konstanten deklariert werden, um die Anzahl der Einträge anzugeben, nicht eine Variable. Warum nicht einfach die bereits vorhandenen Lösungen verwenden, d. H. Die Partitionierungsfunktionen verwenden? – PaulMcKenzie

Verwandte Themen