Phiên bản C ++ của ArrayList của Java là gì


Câu trả lời:


88

Sử dụng std::vectorlớp từ thư viện chuẩn.


2
Hmmm ... từ câu trả lời khác, có vẻ như vector không được triển khai dưới dạng danh sách liên kết? Tôi nói đúng chứ? Tôi đang sử dụng danh sách này như một bộ sưu tập sẽ có doanh thu khá cao của các đối tượng được thêm vào và xóa khỏi nó. Mảng này có thực sự là cách triển khai tốt nhất không? Hay có phiên bản danh sách liên kết không?
giữa các vì sao

4
@interstar - hoàn toàn chính xác. Nếu bạn thực sự muốn ngữ nghĩa danh sách liên kết, thì hãy sử dụng std::list, mặc dù vậy bạn sẽ mất khả năng lập chỉ mục (không operator[]) nên nó không thực sự là một mảng. listcó đặc điểm riêng vectorthường là lựa chọn tốt hơn. Trong các vùng chứa C ++ tiêu chuẩn, bạn sẽ phải thỏa hiệp theo cách này hay cách khác. Nhìn xem deque, điều đó có thể cung cấp nước hoa tốt hơn cho bạn. Nó (tương đối) dễ dàng để đo lường vectorso với dequevs listvì chúng phần lớn có thể hoán đổi cho nhau trong mã - chỉ cần sử dụng một typedef cho vùng chứa của bạn, ví dụ typedef vector<MyObj> MyList.
Steve Townsend

tốt, tôi sẽ thử vector trước. Bởi vì chỉ mục là hữu ích. Nếu quá chậm, tôi có thể chuyển sang danh sách liên kết. Cảm ơn
giữa các vì sao

2
@interstar, ArrayListnhư bạn có thể đoán từ tên, cũng không được triển khai dưới dạng danh sách liên kết. Bạn có thể đang nghĩ đến LinkedList. Ngoài ra, ngay cả khi bạn có số lượng đối tượng được thêm vào và xóa khỏi danh sách khá cao, vectorvẫn có thể nhanh hơn listmiễn là bạn phân bổ đủ không gian cho nó ban đầu mà nó không cần phải phân bổ lại (tức là, cung cấp cho nó không gian tối đa mà nó cần).
Kyle Strand

@KyleStrand Thật thú vị. Tôi luôn cho rằng ArrayList có nghĩa là "một thứ giống như mảng được triển khai dưới dạng danh sách liên kết", chứ không phải là "thứ giống như danh sách được liên kết được triển khai dưới dạng một mảng".
giữa các vì sao

58

Một vài điểm bổ sung được sử dụng lại vectorở đây.

Không giống như ArrayListArraytrong Java, bạn không cần phải làm bất cứ điều gì đặc biệt để coi a vectorlà một mảng - bộ nhớ cơ bản trong C ++ được đảm bảo là liền kề và có thể lập chỉ mục hiệu quả.

Không giống như ArrayList, a vectorcó thể giữ các kiểu nguyên thủy một cách hiệu quả mà không cần đóng gói như một đối tượng chính thức.

Khi xóa các mục khỏi a vector, hãy lưu ý rằng các mục phía trên mục đã xóa phải được chuyển xuống dưới để bảo quản bộ nhớ liền kề. Điều này có thể gây tốn kém cho các thùng chứa lớn.

Đảm bảo nếu bạn lưu trữ các đối tượng phức tạp trong vectorđó các toán tử gán và hàm tạo bản sao của chúng có hiệu quả. Bên dưới, C ++ STL sử dụng chúng trong quá trình quản lý vùng chứa.

Lời khuyên về việc nhập reserve()bộ nhớ trả trước (tức là tại thời điểm xây dựng hoặc khởi tạo vectơ) để giảm thiểu việc phân bổ lại bộ nhớ trên phần mở rộng sau này chuyển từ Java sang C ++.


5
Câu trả lời tốt hơn cho đến nay, nên được chấp nhận.
Paul Rooney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.