Các vectơ có hai thuộc tính "độ dài" có nghĩa là những thứ khác nhau:
size
là số phần tử có thể sử dụng trong vector. Đó là số lượng những thứ bạn đã lưu trữ. Đây là một chiều dài khái niệm.
capacity
là có bao nhiêu phần tử sẽ phù hợp với lượng bộ nhớ mà vectơ hiện đang phân bổ.
capacity >= size
phải luôn luôn đúng, nhưng không có lý do gì để chúng luôn luôn bằng nhau. Ví dụ: khi bạn loại bỏ một phần tử, thu hẹp phân bổ sẽ yêu cầu tạo phân bổ mới một nhóm nhỏ hơn và di chuyển các nội dung còn lại qua ("phân bổ, di chuyển, miễn phí").
Tương tự, nếu capacity == size
và bạn thêm một phần tử, vectơ có thể tăng phân bổ theo một phần tử (một thao tác "phân bổ, di chuyển, tự do" khác), nhưng thông thường bạn sẽ thêm nhiều hơn một phần tử. Nếu công suất cần tăng, vectơ sẽ tăng công suất của nó nhiều hơn một phần tử để bạn có thể thêm một số phần tử nữa trước khi cần di chuyển lại mọi thứ.
Với kiến thức này, chúng tôi có thể trả lời câu hỏi của bạn:
std::vector<T>::resize()
thay đổi kích thước của mảng. Nếu bạn thay đổi kích thước nó nhỏ hơn kích thước hiện tại của nó, các đối tượng dư thừa sẽ bị hủy. Nếu bạn thay đổi kích thước lớn hơn kích thước hiện tại của nó, các đối tượng "mới" được thêm vào cuối được khởi tạo mặc định.
std::vector<T>::shrink_to_fit()
yêu cầu công suất được thay đổi để phù hợp với kích thước hiện tại. (Việc triển khai có thể hoặc không thể thực hiện yêu cầu này. Họ có thể giảm công suất nhưng không làm cho nó bằng với kích thước. Họ có thể không làm gì cả.) Nếu yêu cầu được thực hiện, điều này sẽ loại bỏ một phần hoặc tất cả phần không sử dụng của phân bổ của vectơ. Bạn thường sử dụng điều này khi bạn hoàn thành việc xây dựng một vectơ và sẽ không bao giờ thêm một mục khác vào đó. (Nếu bạn biết trước mình sẽ thêm bao nhiêu mục, sẽ tốt hơn nếu sử dụng std::vector<T>::reserve()
để nói với vectơ trước khi thêm bất kỳ mục nào thay vì dựa vào shrink_to_fit
làm bất cứ điều gì.)
Vì vậy, bạn sử dụng resize()
để thay đổi bao nhiêu công cụ là khái niệm trong vector.
Bạn sử dụng shrink_to_fit()
để giảm thiểu không gian thừa mà vectơ đã phân bổ bên trong mà không thay đổi bao nhiêu công cụ về mặt khái niệm trong vectơ.