簡體   English   中英

根據 function(作為參數給出)返回交換數組元素

[英]Swap array elements depending on function (given as argument) return

我對 function 有一個問題,它需要:數組,該數組的大小和 function(或 lambda),然后根據參數返回的 function 給定的數組排序。 例如:

int a1[] = {1,2,3,4,5,6};

部分(a1,6,是偶數); // 其中 isEven 是簡單的 function 用於檢查元素是否為偶數

應該返回:

[ 2 4 6 1 5 3 ]

我已經這樣寫了,我在這里返回新的排序數組:

template <typename T, typename FUN>
size_t part(T* arr, size_t size, FUN f) {
    T new_arr[size] = {};
    int first = 0;
    int last = size - 1;
    int index = 0;
    bool changed = false;
    for(int i = 0; i < size; i++){
        if(f(arr[i])){
            new_arr[first] = arr[i];
            first++;
        } else { 
            if(!changed){index = i;}
            new_arr[last] = arr[i];
            last--;
        }
    }
    for(int j = 0; j < size; j++){
        std::cout << new_arr[j] << " ";
    }
    return new_arr;
}

但是我必須在不使用任何其他數組的情況下執行此操作。 而且它必須在一個循環中完成。

你快到了。

您不得使用額外的數組。 但是在T new_arr[size] = {};你試着這樣做。 而且,這是行不通的,因為這是一個 VLA(可變長度陣列)。 VLA 不是 C++ 語言的一部分。 一些編譯器接受 VLA 作為擴展,但是,如果你告訴他們編譯 C++,那么它們也會拒絕它。 在 C++ 中,數組的大小必須在編譯時已知。 它必須是一個常數。

所以,因為你無論如何都使用指針,你也可以使用new來分配臨時 memory。然后只需將上面的行替換為T* new_arr = new T[size]{};

並且,你一定不要忘記刪除分配的memory。或者,你可以將function末尾的新數據復制到原始數據,然后刪除那里的臨時數組memory。

所以,在我看來這不是最好的方法。 無論如何,C++ 標准庫具有函數partitionstable_partition

反正。 請看下面:

#include <iostream>
#include <algorithm>
template <typename T, typename FUN>
T* part(T* arr, size_t size, FUN f) {
    T* new_arr = new T[size]{};
    int first = 0;
    int last = size - 1;
    int index = 0;
    bool changed = false;
    for (int i = 0; i < size; i++) {
        if (f(arr[i])) {
            new_arr[first] = arr[i];
            first++;
        }
        else {
            if (!changed) { index = i; }
            new_arr[last] = arr[i];
            last--;
        }
    }
    return new_arr;
}

int main() {
    int data[]{ 1,2,3,4,5,6 };
    int *p = part(data, (sizeof(data) / sizeof(data[0])), [](const int i) {return i % 2 == 0; });
    for (int i = 0; i < (sizeof(data) / sizeof(data[0])); ++i) 
        std::cout << p[i] << ' ';
    delete[]p;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM