我的代码创建了数组,我需要对其进行删除,但我不知道如何精美而正确地进行。
主要代码
template<class T1>
auto auto_vector(T1&& _Size) {
return new int64_t[_Size]{};
}
template <class T1, class... T2>
auto auto_vector(T1&& _Size, T2&&... _Last)
{
auto result = new decltype(auto_vector(_Last...))[_Size];
for (int64_t i = 0; i < _Size; ++i) {
result[i] = auto_vector(_Last...);
}
return result;
}
这是我要与第一个结合的代码
template <class T1, class T2, class T3, class T4>
void del_vector(T4& _Del, T1& _Size, T2& _Size2, T3& _Size3) {
for (ptrdiff_t i = 0; i < _Size3; ++i) {
for (ptrdiff_t k = 0; k < _Size2; ++k) {
delete _Del[i][k];
}
delete _Del[i];
}
delete _Del;
}
int main()
{
auto map1 = auto_vector(_Size, _Size2, _Size3);
auto map2 = auto_vector(3, 4, 5, 7);
del_vector(map1, _Size, _Size2, _Size3);
return 0;
}
我不喜欢这个选项,我想要类似的东西。
int main()
{
auto_vector map1(_Size, _Size2, _Size3);
del_vector map1(_Size, _Size2, _Size3);
//or so
auto_vector<_Size, _Size2, _Size3> map1;
del_vector<_Size, _Size2, _Size3> map1;
return 0;
}
之所以这样做,是因为我不能仅使用向量来实现同一件事而且我不明白向量为何不适用于动态阵列,事实是我不知道确切的数据_Size, _Size2, _Size3 = ?
编译之前。
因此,我只使用new
,而我只为他着想。
如果对测试数据有用的话
cout << " ---------TEST---------- " << endl;
for (ptrdiff_t i = 0; i < _Size3; ++i) {
for (ptrdiff_t k = 0; k < _Size2; ++k) {
for (ptrdiff_t j = 0; j < _Size; ++j) {
cout << map1[i][k][j] << " ";
}
cout << endl;
}
cout << endl;
}
cout << " ---------TEST---------- " << endl;
代码中的new
操作过多。同样,del_vector
在您的首选版本中没有任何意义,因为任何体面的类都会在析构函数中释放其数据(除非它没有所有权)。
您需要做一个包装完事情的类或模板类。
template<size_t dim>
class myMultiArray
{
public:
A(std::array<size_t, dim> sizes); // resizes m_data to multiplication of sizes
int operator () (std::array<size_t, dim> indexes) const; // access operator
int& operator () (std::array<size_t, dim> indexes); // modify operator
// you'll probably need more utility functions for such a multi dimensional array
private:
std::vector<int> m_data;
std::array<size_t, dim> m_sizes;
}