2009-12-14 33 views
11

上进行换档动作最佳方式假设我有一个数组到一个数组

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

是否有除了刚才复制他们都到另一个阵列对其执行移位操作的方式。我们可以使用链表轻松地做到这一点,但我想知道我们是否可以使用移位操作符并更快地完成工作。

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

+0

你想完成什么,复制数组? – 2009-12-14 20:15:32

+4

也许这只是我,但我有点不清楚 - 你想要按位移动数组中的每个元素,还是循环移动整个数组? – maxaposteriori 2009-12-14 20:16:57

+0

你是否在移动数组的元素,即arr [0] = arr [1]等,或者你是否移位数组中的每个元素,即arr [0] = arr [0] << 2?如果前者,删除“按位”标签。 – mch 2009-12-14 20:22:00

回答

20

如果你想在元素的循环移位:

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

...会做的伎俩。你需要#include算法头。

+1

快速链接http://www.cplusplus.com/reference/algorithm/rotate/ – wardw 2013-04-16 19:16:55

+2

快速链接http://en.cppreference。com/w/cpp/algorithm/rotate – 2015-02-05 10:58:46

7

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

只要记住当你释放它时保持原来的指针。

9

只要阵列是可以修改的,你可以使用的memmove转移他们(但不要错误地使用memcpy作为的memcpy并不意味着重叠的区域):

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

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

+0

这完全失去了'arr [0]'的值 - 对于循环移位,您必须保存该值并将其存储在'memmove'之后的最后一个元素中。 – caf 2009-12-14 22:38:20

+0

甜美而紧凑的答案 – ssj 2011-04-18 05:59:51

+0

适用于Arduino – Jacksonkr 2016-09-03 15:38:44

0

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

6

如果您正在寻找纯粹的C解决方案,那么它就是包括一个驱动程序。它原来是非常简单的:由n旋转,您:

  1. 反向就地第一n元素,
  2. 反向就地其余元素,并
  3. 扭转整个阵列-地点。

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

#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; 
} 
+0

@Alok:感谢这个人......看起来真的很有帮助 – tomkaith13 2009-12-15 19:19:38