C ++删除动态数组的最后一个元素
c++ delete last element of dynamic array
在 C++ 中,我采用了 n 个元素的动态数组
int* a = new int[n];
那个数组的所有元素左移后,最后一个元素,即a[n-1]没用了,我想删除它。
右移后我需要删除数组的第一个元素,并有一个指向第二个元素的指针,即我需要创建一个长度为 n-1 的数组。
我该怎么做?
您需要分配一个新数组并将原数组的元素复制到新数组中。
这是一个演示程序
#include <iostream>
#include <utility>
#include <algorithm>
size_t shift_left( int * &a, size_t n )
{
if ( n )
{
int *p = new int [n-1];
std::copy( a + 1, a + n, p );
std::swap( a, p );
delete []p;
}
return n == 0 ? n : n - 1;
}
size_t shift_right( int * &a, size_t n )
{
if ( n )
{
int *p = new int [n-1];
std::copy( a, a + n - 1, p );
std::swap( a, p );
delete []p;
}
return n == 0 ? n : n - 1;
}
int main()
{
size_t n = 10;
int *a = new int[n] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( const int *p = a; p != a + n; p++ )
{
std::cout << *p << ' ';
}
std::cout << '\n';
n = shift_left( a, n );
for ( const int *p = a; p != a + n; p++ )
{
std::cout << *p << ' ';
}
std::cout << '\n';
n = shift_right( a, n );
for ( const int *p = a; p != a + n; p++ )
{
std::cout << *p << ' ';
}
std::cout << '\n';
delete []a;
return 0;
}
它的输出是
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
您可以通过以下方式更改功能。当n的传递值等于1的时候就释放原来的指针,设置为nullptr.
例如
size_t shift_left( int * &a, size_t n )
{
if ( n )
{
if ( n == 1 )
{
delete []a;
a = nullptr;
}
else
{
int *p = new int [n-1];
std::copy( a + 1, a + n, p );
std::swap( a, p );
delete []p;
}
}
return n == 0 ? n : n - 1;
}
作为替代方案,您可以使用标准容器 std::vector
及其成员函数 erase
.
或者您可以考虑使用std::valarray
。
在 C++ 中,我采用了 n 个元素的动态数组
int* a = new int[n];
那个数组的所有元素左移后,最后一个元素,即a[n-1]没用了,我想删除它。 右移后我需要删除数组的第一个元素,并有一个指向第二个元素的指针,即我需要创建一个长度为 n-1 的数组。 我该怎么做?
您需要分配一个新数组并将原数组的元素复制到新数组中。
这是一个演示程序
#include <iostream>
#include <utility>
#include <algorithm>
size_t shift_left( int * &a, size_t n )
{
if ( n )
{
int *p = new int [n-1];
std::copy( a + 1, a + n, p );
std::swap( a, p );
delete []p;
}
return n == 0 ? n : n - 1;
}
size_t shift_right( int * &a, size_t n )
{
if ( n )
{
int *p = new int [n-1];
std::copy( a, a + n - 1, p );
std::swap( a, p );
delete []p;
}
return n == 0 ? n : n - 1;
}
int main()
{
size_t n = 10;
int *a = new int[n] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( const int *p = a; p != a + n; p++ )
{
std::cout << *p << ' ';
}
std::cout << '\n';
n = shift_left( a, n );
for ( const int *p = a; p != a + n; p++ )
{
std::cout << *p << ' ';
}
std::cout << '\n';
n = shift_right( a, n );
for ( const int *p = a; p != a + n; p++ )
{
std::cout << *p << ' ';
}
std::cout << '\n';
delete []a;
return 0;
}
它的输出是
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
您可以通过以下方式更改功能。当n的传递值等于1的时候就释放原来的指针,设置为nullptr.
例如
size_t shift_left( int * &a, size_t n )
{
if ( n )
{
if ( n == 1 )
{
delete []a;
a = nullptr;
}
else
{
int *p = new int [n-1];
std::copy( a + 1, a + n, p );
std::swap( a, p );
delete []p;
}
}
return n == 0 ? n : n - 1;
}
作为替代方案,您可以使用标准容器 std::vector
及其成员函数 erase
.
或者您可以考虑使用std::valarray
。