2011-08-10 28 views
8

Hiện tại tôi sử dụng mẫu chứa vector STL để đặt lại và nhận kết nối.cấu trúc dữ liệu tối ưu cho vùng chứa hồ bơi là gì?

1) khi nhận được, kết nối được trả về và "xóa()" d khỏi vectơ nhóm.

2) khi được thả, kết nối được đưa trở lại hồ bơi qua "push_back()".

Điều này có thể rất nặng nếu hồ bơi thường xuyên được sử dụng. Vì vậy, câu hỏi của tôi là, có cách nào để cải thiện hiệu suất ở đây bằng cách chuyển sang cấu trúc dữ liệu khác không?

+1

Hiếm khi tắc nghẽn là chúng tôi cho rằng chúng là như vậy, vì vậy việc lập hồ sơ tốt hơn nhiều so với việc cố gắng tối ưu hóa xung quanh không ngừng. – Simone

+0

điều chắc chắn - hồ sơ. nhưng khái niệm thấy đây là cách tiếp cận đúng bằng cách sử dụng một container, tôi đoán ... – Myz

Trả lời

11
  • Nếu bạn chỉ chắp thêm ở phía sau và xóa từ phía sau, vector là tốt.
  • Nếu bạn nối và xóa từ cả mặt trước và mặt sau, nhưng không bao giờ ở giữa, hãy sử dụng deque.
  • Nếu bạn thường xuyên phải chèn vào và xóa từ giữa, hãy sử dụng list.
  • Tùy thuộc vào các yêu cầu tra cứu và tra cứu của bạn, set có thể là giải pháp thay thế.

Trong mọi trường hợp, bạn nên cấu hình hiệu suất; sử dụng typedef cho vùng chứa chính của bạn để bạn có thể nhanh chóng chuyển đổi và kiểm tra các tùy chọn khác nhau.

Có thể có các yêu cầu khác mà bạn không được nói cho chúng ta nhưng đó là quan trọng đối với sự lựa chọn của container:

  • vector và deque là container truy cập ngẫu nhiên; danh sách và tập hợp dựa trên nút. Điều này ảnh hưởng đến hiệu lực của trình vòng lặp.
  • vectơ, deque và danh sách là các vùng chứa chuỗi, trong khi tập hợp được kết hợp; điều này ảnh hưởng đến tra cứu theo giá trị.
+0

+1 để đề cập đến hồ sơ. – Simone

+0

Tôi cũng sẽ thêm rằng nếu OP không xóa từ phía sau, anh ta nên xem xét phương pháp này (tức là luôn 'pop_back' và' push_back') - đó là một nhóm, vì vậy tôi đoán rằng không có * thứ tự * và có thể có ích khi luôn sử dụng mục cuối cùng ... – Nim

+0

không có thứ tự – Myz

2

Giữ véc tơ nếu bạn biết số lượng kết nối tối đa có thể trước (xem vector :: dự trữ).

Nếu không, hãy sử dụng std :: list.

Cuối cùng, nó cũng phụ thuộc vào nền tảng của bạn và phiên bản trình biên dịch và libstdC++ được sử dụng.

+0

'std :: list' có nghĩa là phân bổ cho mỗi lần chèn. điều này sẽ không nhanh hơn 'std :: vector'. –

3

std::vector có lẽ là vùng chứa tốt nhất cho hồ bơi. O (1) để chèn và bạn cũng có thể có O (1) để loại bỏ nếu bạn không cần phải duy trì trật tự. Bạn chỉ có thể trao đổi mục cuối cùng với mục bị xóa và thu nhỏ vectơ. Ngoài ra std::vector là không gian khá hiệu quả so với các container khác. Tiêu thụ bộ nhớ thấp cũng có nghĩa là hiệu suất tốt hơn do có nhiều lần truy cập bộ nhớ cache CPU hơn.

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