[英]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++ 標准庫具有函數partition和stable_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.