按顺序移动数组中的元素

时间:2011-10-25 20:21:22

标签: c++ c arrays swap

如何按顺序移动数组中的元素或从数组中删除?

示例:arr [3,3,2,1]

move(arr[0],arr[sizeof(arr)]);

ARR [3,2,1,3];

我写了函数,但是它是正确的吗?

void remove(int index, char *arr)
{
    arr[index]=NULL;
    for(int i=index;i<sizeof(arr)-1;i++)
        swap(arr[i],arr[i+1]);
}

6 个答案:

答案 0 :(得分:2)

好吧,首先,我建议使用std::vector而不是数组,因为你使用的是C ++。它将使这个过程更加简单。至于你的功能,我想介绍几件事......

 arr[index] = NULL;

如果我没记错,NULL为0,所以这很好。但是,我假设你的印象是这是一个指针,它不是。虽然您可能有一个指向数组的指针,但数组的每个单独元素都不是指针。要得到这个,你需要传递一个char **。这种情况在这种情况下起作用的原因是因为char实际上是一个int。

sizeof(arr)-1

这不会为您提供数组元素的数量。你询问了arr的大小,它将返回指针数据类型的大小。这里更好的选择是迭代指针算法,直到到达数据的末尾。请记住,在一天结束时指向数组的指针仍然只是一个指针,并且不包含有关数组本身的任何开销。它只知道它指向哪个元素。

答案 1 :(得分:1)

您不必对元素进行NULL或交换。

void remove(int index, char *arr)
{
    int i;
    for(i=index;i<strlen(arr)-1;i++)
        arr[i] = arr[i+1];
    arr[i] = NULL;  // i now points to last, "extra" element
}

答案 2 :(得分:1)

这已存在于C ++标准库(std::rotate)和C标准库(memmove

如果你正在使用C ++,(因为它带有std::swap函数,而C不能与这样的参数交换):

void remove(int index, char *arr, int len)
{
    if (len<=0)
        len = strlen(arr);
    std::rotate(arr+index, arr+index+1, arr+len);
    arr[len-1] = NULL;
}

此外,在C ++中,使用std::vectorstd::string而不是裸char*指针。

如果你正在使用C:

void remove(int index, char *arr, int len)
{
    if (len<=0)
        len = strlen(arr);
    memmove(arr+index, arr+index+1, len-index-1);
    arr[len-1] = NULL;
}

如果您使用裸char*指针,请始终传递长度。

答案 3 :(得分:1)

sizeof(arr)被声明为具有维度的实际数组时,arr将为您提供数组的字节数(实际上,C ++不知道字节,仅{ {1}} s,但现在暂不进入。 char毫无意义:你告诉编译器要使索引处的元素在数值上等于以字节为单位的数组大小,这总是超出范围。顺便说一句,要获得元素中的数组的大小,请使用:arr[sizeof(arr)]

sizeof(arr) / sizeof(arr[0])sizeof(arr)将给出指针的大小(通常为4或8个字节,具体取决于位数),无论指针在“下方”的数组有多大。

即使您修复了所有这些(以及其他一些较小的事情,例如使用char *arr作为整数),您仍然只是将元素移动到数组的末尾,而不是实际 re - 移动它。

我建议您使用NULL及其std::vector方法。如果您从中间进行了大量删除(并且您可以在没有随机访问权限的情况下生活),请考虑使用erase(以及 std::list)。或者,您也可以考虑erase

答案 4 :(得分:0)

不要交换你的元素只需将所有权利分配的元素向左移动一个位置以覆盖你的元素。不要忘记减小阵列的大小。

答案 5 :(得分:-3)

看起来确实如此。 您应该区分要从阵列中删除元素的情况,或者只是移动它。 也许最好将计数(通过移动量)作为参数传递,当它等于数组长度(例如0)时,元素将被删除。