在arrays上执行移位操作的最佳方法

假设我有一个数组

unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9}; 

除了将它们全部复制到另一个数组之外,还有办法对它们执行移位操作。 我们可以使用链表轻松地完成它,但我想知道我们是否可以使用移位运算符并更快地完成工作。

注意:这个问题中的数据只是一个例子。 答案应该与数组中的数据无关。

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

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

……会做的。 您需要#include算法标题。

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

 memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr)); 

(sizeof(arr) – sizeof(* arr)是除数组的1个元素之外的所有字符的大小(以字节为单位)。

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

只需记住在释放它时保持原始指针。

如果您正在寻找纯C解决方案,那么它包括一个驱动程序。 结果很简单:用n旋转,你:

  1. 将原n元素反转到位,
  2. 将原有的剩余元素反转,并且
  3. 将整个arrays反转到位。

这需要一个额外的存储元素(用于反转)。

 #include  #include  #include  /* 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; } 

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