这是一个糟糕的想法(或者可能是一个糟糕的学校练习)。请使用std::vector,或者在最坏的情况下使用std::array。
(另外,也许不要将普通数组称为“vector”,不要将size称为dim(可能与维数混淆),不要使用int are 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 或任何适合您的用例。它具有更多的功能和更少的错误。