以下功能
int* del_element(int* vector, int dim, int el)
{
// ...?
}
正在接收一個動態分配的陣列。為了洗掉元素并回傳獲得的陣列,我可以在里面寫什么?
uj5u.com熱心網友回復:
這不是一個好主意,但它回答了這個問題。在最初的問題中,您有注釋“洗掉其維度”,我將其解釋為您想縮小分配的記憶體。例子:
#include <algorithm> // std::copy_n
#include <iostream>
int* del_element(int* vector, int dim, int el) {
int* rv = nullptr;
if(--dim > 0) { // must have at least 1 element
rv = new int[dim]; // allocate new memory
// copy the the elements before `el`:
std::copy_n(vector, el, rv);
// copy the elements after `el`:
std::copy_n(vector el 1, dim - el, rv el);
}
delete[] vector; // delete the old data
return rv; // return the new data (nullptr if empty)
}
int main() {
int* v = new int[10]{0,1,2,3,4,5,6,7,8,9};
v = del_element(v, 10, 5); // erase the sixth element
for(int* it = v, *end = v 9; it != end; it) {
std::cout << *it << '\n';
}
delete[] v;
}
無需縮小分配的記憶體,您只需std::move洗掉所選元素的資料即可:
int* del_element(int* vector, int dim, int el) {
// move the elements after `el` one step to "the left":
std::move(vector el 1, vector dim, vector el);
return vector;
}
更好的方法是使用std::vector<int>:
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{0,1,2,3,4,5,6,7,8,9};
v.erase(v.begin() 5); // erase the sixth element
for(int value : v) {
std::cout << value << '\n';
}
}
uj5u.com熱心網友回復:
這是一個壞主意(或者可能是一個糟糕的學校練習)。請使用 a ,std::vector或者在最壞的情況下使用 a std::array。
(另外,也許不呼叫一個普通的陣列的“ vector”,不叫size一個dim(其可以與維數),不使用混淆int物size_t應該是,在可能的情況避免原始指標等)
該函式應該回傳一個std::unique_ptr<int[]>以清楚地記錄所有權轉移。
如果您應該處理原始陣列,請提出一個std::unique_ptr<int[]>論點。如果您不應該處理原始陣列,請提出一個const int *論點。
最重要的是,用valgrind;仔細檢查所有內容;它必須無錯誤地終止。
最后但并非最不重要的一點是,如果可能,不要將元素型別限制為int; 你未來的自己會感謝你。
#include <memory>
template<typename Element>
std::unique_ptr<Element[]> del_element(std::unique_ptr<Element[]> array,
size_t size, size_t idx) {
auto result = std::make_unique<Element[]>(size - 1);
for (size_t i = 0; i < idx; i) result[i] = array[i];
for (size_t i = idx 1; i < size; i) result[i - 1] = array[i];
return result;
}
另外,設定列印功能用于除錯。
#include <iostream>
template<typename Element>
void print_array(const Element *array, size_t size) {
std::cout << '[';
if (size) {
std::cout << *array;
for (size_t i = 1; i < size; i) std::cout << ", " << array[i];
}
std::cout << ']' << std::endl;
}
另外,不要忘記測驗它。valgrind是你的朋友!
int main() {
std::unique_ptr<int[]> first = std::make_unique<int[]>(7);
for (size_t i = 0; i < 7; i) first[i] = i - 3;
print_array(first.get(), 7);
std::unique_ptr<int[]> second = del_element(std::move(first), 7, 3);
print_array(second.get(), 6);
std::unique_ptr<int[]> third = del_element(std::move(second), 6, 0);
print_array(third.get(), 5);
std::unique_ptr<int[]> forth = del_element(std::move(third), 5, 4);
print_array(forth.get(), 4);
std::unique_ptr<int[]> fifth = del_element(std::move(forth), 4, 2);
print_array(fifth.get(), 3);
std::unique_ptr<int[]> sixth = del_element(std::move(fifth), 3, 1);
print_array(sixth.get(), 2);
std::unique_ptr<int[]> seventh = del_element(std::move(sixth), 2, 0);
print_array(seventh.get(), 1);
std::unique_ptr<int[]> eighth = del_element(std::move(sixth), 1, 0);
print_array(eighth.get(), 0);
}
最后但并非最不重要的,請丟了這么多廢話,距離使用std::vector,std::deque,std::list或任何適合您的使用情況。它具有更多功能和更少錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336666.html
