C++ 对阵列执行移位操作的最佳方法

C++ 对阵列执行移位操作的最佳方法,c++,c,C++,C,假设我有一个数组 unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9}; 除了将它们全部复制到另一个数组中之外,还有什么方法可以对它们执行移位操作呢。我们可以很容易地使用链表,但我想知道我们是否可以使用移位运算符更快地完成工作 注:本问题中的数据仅为示例。答案应该与数组中的数据无关。如果您是唯一拥有指向数组指针的人,只需增加指针并减少长度即可 只要记住在释放时保留原始指针。只要数组可修改,就可以使用memmove来移动它们(但不要错误地使用memcpy,因为me

假设我有一个数组

unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9};
除了将它们全部复制到另一个数组中之外,还有什么方法可以对它们执行移位操作呢。我们可以很容易地使用链表,但我想知道我们是否可以使用移位运算符更快地完成工作


注:本问题中的数据仅为示例。答案应该与数组中的数据无关。

如果您是唯一拥有指向数组指针的人,只需增加指针并减少长度即可


只要记住在释放时保留原始指针。

只要数组可修改,就可以使用memmove来移动它们(但不要错误地使用memcpy,因为memcpy并不用于重叠区域):


(sizeof(arr)-sizeof(*arr)是数组中除1个元素外的所有元素的字节大小。

我想知道您是否应该使用std::valarray。

如果您想要元素的循环移位:

std::rotate(&arr[0], &arr[1], &arr[10]);

。。。我会成功的。你需要#包含算法头。

如果你真的想要极快的速度,请查看带进位操作的汇编器移位。
通过循环,您可以在毫秒内对数组进行位移位。

如果您正在寻找纯C解决方案,这里就是,包括一个驱动程序。结果很简单:按
n
旋转,您:

  • 将第一个
    n
    元素反转到位
  • 将其余图元反转到位,然后
  • 将整个阵列反转到位
  • 这需要一个元素的额外存储(用于反转)

    #包括
    #包括
    #包括
    /*打印数组*/
    静态无效打印数组(无符号字符*arr,大小\u t n,常量字符*前缀)
    {
    尺寸i;
    if(前缀){
    printf(“%s:”,前缀);
    }
    对于(i=0;i1){
    字符*eptr;
    shift=strtoul(argv[1],&eptr,0);
    如果(*eptr | | errno==ERANGE){
    perror(“strtoul”);
    返回退出失败;
    }
    }
    打印阵列(arr、narr,“轮班前”);
    旋转(arr、narr、shift);
    打印阵列(arr、narr,“轮班后”);
    返回退出成功;
    }
    
    复制数组,你想做什么?也许只是我,但我有点不清楚——你想对数组中的每个元素进行位移位,还是对整个数组进行循环移位?是将数组中的元素进行移位,即arr[0]=arr[1],等等,还是对数组中的每个元素进行位移位,即arr[0]=arr[0]@Andy:尝试实现循环移位这将完全丢失
    arr[0]
    -对于循环移位,您必须保存该值并将其存储在
    memmove
    之后的最后一个元素中。
    std::rotate(&arr[0], &arr[1], &arr[10]);
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    
    /* print an array */
    static void print_array(unsigned char *arr, size_t n, const char *prefix)
    {
        size_t i;
    
        if (prefix) {
            printf("%s: ", prefix);
        }
        for (i=0; i < n; ++i) {
            printf("%02x ", (unsigned int)arr[i]);
        }
        printf("\n");
    }
    
    /* reverse 'arr', which has 'narr' elements */
    static void reverse(unsigned char *arr, size_t narr)
    {
        size_t i;
    
        for (i=0; i < narr / 2; ++i) {
            unsigned char tmp = arr[i];
            arr[i] = arr[narr-i-1];
            arr[narr-i-1] = tmp;
        }
    }
    
    /* rotate 'arr' of size 'narr' by 'shift' */
    static void rotate(unsigned char *arr, size_t narr, unsigned long shift)
    {
        reverse(arr, shift);
        reverse(arr + shift, narr - shift);
        reverse(arr, narr);
    }
    
    /* driver program */
    int main(int argc, char *argv[])
    {
        unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9,10};
        size_t narr = sizeof arr / sizeof arr[0];
        unsigned long shift = 2;
    
        if (argc > 1) {
            char *eptr;
            shift = strtoul(argv[1], &eptr, 0);
            if (*eptr || errno == ERANGE) {
                perror("strtoul");
                return EXIT_FAILURE;
            }
        }
        print_array(arr, narr, "before shift");
        rotate(arr, narr, shift);
        print_array(arr, narr, "after shift");
        return EXIT_SUCCESS;
    }