2013-09-02 58 views
7

Tôi có một mảng chứa lịch sử giá trị, và khi thêm một giá trị mới, tôi cần phải chuyển tất cả các giá trị trước đó sang một vị trí sang trái, để mất giá trị cũ nhất và nhường chỗ cho giá trị tiếp theo.Cách tốt nhất để thay đổi một mảng trong C là gì?

tôi có thể nghĩ đến hai cách để làm điều này, bằng cách sử dụng memmove:

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

Hoặc bằng cách trao đổi các con trỏ:

for (i = 0; i != sizeof(arr) - 1; i++) { 
    *(arr + i) = *(arr + i + 1); 
} 

Có một sự khác biệt hiệu suất giữa hai phương pháp, và nếu không, cái nào sẽ được thông báo?

+1

Bạn đã cân nhắc không sử dụng mảng cho điều này hay không phải là một tùy chọn? – nic

+1

@nic Tôi cần phải theo dõi các giá trị X cuối cùng, vì vậy tôi không thể nghĩ ra bất kỳ cách hợp lý hơn để lưu trữ chúng ngoại trừ một mảng. – Muis

+0

Sử dụng hàng đợi (bạn vẫn có thể sử dụng một mảng để triển khai nó) và tránh sao chép bộ nhớ. http://www.thelearningpoint.net/computer-science/data-structures-queues--with-c-program-source-code –

Trả lời

3

Cả hai đều có độ phức tạp tương tự nhau. Bất kỳ sự khác biệt nào về hiệu suất sẽ là do hoàn cảnh cụ thể, chẳng hạn như CPU, trình biên dịch, cách memmove được triển khai và kích thước của mảng, vì vậy bạn phải thực sự đo lường hiệu suất theo từng cách và xem điều gì là tốt nhất.

+1

Đọc đầu ra lắp ráp cũng có thể mang tính hướng dẫn. – chrylis

1

Tôi không nghĩ rằng một mảng là cách tốt nhất để làm điều này, hãy thử sử dụng một danh sách liên kết và bạn sẽ không gặp vấn đề này.

7

Có một lựa chọn nhanh hơn:

Một circular buffer nơi chèn, loại bỏ và đọc được tất cả các O (1).

0

Bạn có thể sử dụng FIFO Queue được triển khai dưới dạng danh sách được liên kết hoặc dưới dạng mảng. Từ mô tả của bạn, đó là giải pháp đơn giản nhất.