Chỉ cần quay lại sử dụng C ++ và cố gắng chuyển đổi một chương trình Java đơn giản mà tôi đã viết gần đây.
Đâu là ưu tiên tương đương với Java ArrayList trong C ++?
Chỉ cần quay lại sử dụng C ++ và cố gắng chuyển đổi một chương trình Java đơn giản mà tôi đã viết gần đây.
Đâu là ưu tiên tương đương với Java ArrayList trong C ++?
Câu trả lời:
Sử dụng std::vector
lớp từ thư viện chuẩn.
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. list
có đặc điểm riêng vector
thườ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 vector
so với deque
vs list
vì 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
.
ArrayList
như 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, vector
vẫn có thể nhanh hơn list
miễ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).
Một vài điểm bổ sung được sử dụng lại vector
ở đây.
Không giống như ArrayList
và Array
trong Java, bạn không cần phải làm bất cứ điều gì đặc biệt để coi a vector
là 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 vector
có 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 ++.