2010-12-10 38 views
6

Tôi đang chuyển một số c-code rất cũ vào C++ và tôi đã chạy qua một danh sách liên kết được triển khai trong một mảng. Phần tử là cấu trúc đơn giản:Suy nghĩ về cách triển khai?

struct element 
{ 
    void *m_ptrData; 
    short m_nextEntry; 
    short m_prevEntry; 
}; 

Là một mảng, có thể truy cập nhanh vào dữ liệu, nếu bạn biết chỉ mục. Các khía cạnh danh sách liên kết cho phép các yếu tố được di chuyển xung quanh, và "xóa" từ danh sách. Các yếu tố có thể được di chuyển trong danh sách, dựa trên tần suất sử dụng (cho MRU và xuống cho LRU).

Tôi thích tìm cách tốt hơn để triển khai điều này hơn là sử dụng mảng khác. Tôi muốn sử dụng STL, nhưng tôi không chắc chắn container nào là tốt nhất để sử dụng.

Bất kỳ ai có bất kỳ suy nghĩ nào?

+0

Tốc độ truy cập ngẫu nhiên có quan trọng không? Tôi có nghĩa là nó xảy ra * rất nhiều *, như trái ngược với iterating? – Guy

+0

Nó phụ thuộc hoàn toàn vào cách nó được sử dụng bởi phần còn lại của mã. Là truy cập trực tiếp một cách phổ biến của các yếu tố truy cập, hoặc là nó được thực hiện chủ yếu bằng cách bước qua danh sách? Một số yếu tố có được truy cập thường xuyên hơn các yếu tố khác không? – suszterpatt

+3

Tôi đã từng đọc một bài báo tuyên bố (và bảo vệ) xác nhận rằng 'std :: vector' hầu như luôn là lựa chọn tốt hơn' std :: list', ngay cả khi bạn thêm/xóa các mục từ giữa vùng chứa . Tôi không thể tìm thấy bài viết ngay bây giờ, vì vậy tôi đã thêm bài viết này làm nhận xét thay vì trả lời. Tôi sẽ đánh giá cao nếu một số người khác biết về bài viết có thể đăng liên kết. –

Trả lời

10

Do đây là một danh sách liên kết, có lẽ bạn nên sử dụng std::list ...

Nguyên tắc hàng đầu là bạn muốn sử dụng một danh sách liên kết khi bạn cần chèn các phần tử vào các vị trí ngẫu nhiên trong danh sách, hoặc xóa các phần tử ngẫu nhiên khỏi danh sách. Nếu bạn chủ yếu cần thêm/xóa các phần tử vào/từ cuối danh sách, thì bạn nên sử dụng std::vector. Nếu bạn cần thêm/xóa các phần tử vào/từ đầu hoặc cuối danh sách, thì bạn nên sử dụng std::deque.

Hãy nhớ, chúng tôi đang nói về xác suất ở đây. Nếu bạn cần phải chèn một phần tử vào giữa một std::vector một lần trong một mặt trăng màu xanh, điều đó có thể sẽ ổn. Nhưng nếu bạn cần phải làm điều này tất cả các thời gian, nó sẽ có tác động lớn đến hiệu suất, bởi vì các vector sẽ cần phải liên tục di chuyển các yếu tố của nó, và có thể tái phân bổ bộ nhớ của nó quá. Mặt khác, lợi thế của việc sử dụng một véc tơ là các phần tử của nó tiếp giáp trong bộ nhớ, giúp cải thiện đáng kể hiệu suất nếu bạn chỉ cần duyệt qua chúng theo thứ tự do bộ nhớ đệm.

+0

Truy cập trực tiếp là quyền truy cập phổ biến nhất – kberson

+2

@kberson nb. std :: danh sách không hỗ trợ truy cập trực tiếp theo chỉ mục. – razlebe

+0

Cần có khả năng truy cập trực tiếp vào các phần tử chỉ với chỉ mục. Cần để có thể di chuyển các phần tử, vì vậy stl :: vector không hoạt động. – kberson

4

Vì dữ liệu trong danh sách này là con trỏ, tại sao lại bận tâm với danh sách liên kết? Đối với POD nhỏ, std::vector thường là đặt cược đầu tiên tốt nhất và do vị trí tốt hơn dữ liệu của nó phát độc đáo với bộ xử lý lưu trữ, nó thường thực hiện danh sách được liên kết ngay cả ở đâu, về lý thuyết, danh sách được liên kết nên tốt hơn. Tôi muốn chọn std::vector cho đến khi một số tiểu sử cho thấy rằng có sự cố về hiệu suất và std::list hoạt động tốt hơn.

Các vấn đề liên quan