2009-12-14 49 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