Gọi clear()
trên một vectơ sẽ gọi các destructor của bất cứ thứ gì được lưu trữ trong vectơ, đó là một hoạt động thời gian tuyến tính. Nhưng đây có phải là trường hợp khi vectơ chứa các kiểu nguyên thủy như int
hoặc double
không?Là `std :: vector <primitive> :: clear()` một hoạt động liên tục thời gian?
Trả lời
Hãy nghĩ về điều này từ POV về cách thực hiện vector
. Khi bạn gọi:
delete [] internalPtr;
Điều gì xảy ra?
- Heap phải giải phóng một khối liền kề không gian
- destructors phải sa thải hoặc từng đối tượng trong internalPtr
Cựu vẫn phải xảy ra với nhiều loại nguyên thủy, nhưng hủy không tồn tại đối với họ. Vì vậy, delete[]
sẽ thực hiện hoàn toàn dựa vào tốc độ của đống có thể xóa một khối bộ nhớ
Ít nhất bằng cách sử dụng default allocator, 'std :: vector' sẽ không sử dụng' delete [] internalPtr; '. –
Trong liên kết này:
http://www.cplusplus.com/reference/vector/vector/clear/
Nó nói phức tạp của clear()
là tuyến tính có kích thước (tàn phá).
Tôi thực sự không thể tìm thấy bất cứ điều gì trong tiêu chuẩn C++ 11 để sao lưu này. Liên kết có thể sai. – juanchopanza
Tôi tin rằng câu trả lời phụ thuộc vào việc triển khai thực hiện. Phải mất tối đa thời gian tuyến tính, nhưng một số triển khai có thể chọn tối ưu hóa điều này.
Mỗi 'Does clearing a vector affect its capacity?', cả MSVC lẫn G ++ đều không làm giảm dung lượng của véc tơ của chúng, ngay cả khi gọi .clear
. Nhìn vào các tiêu đề G ++, rõ ràng là .clear
là hằng số thời gian với trình phân bổ mặc định, miễn là các phần tử là vô hướng (các kiểu số học hoặc con trỏ nguyên thủy).
Điều đó có vẻ phù hợp với thực tế tôi không thể tìm thấy bất cứ điều gì về 'vector :: clear()' (hoặc các container sequence 'rõ ràng() cho rằng vấn đề) trong tiêu chuẩn. Tất nhiên, có thể tôi không tìm kiếm đúng cách ... – juanchopanza
@juanchopanza: Tôi đã xem thông số kỹ thuật, và nó thực sự dường như [bị thiếu] (http://stackoverflow.com/questions/14970747/is-the-complexity-of-vectorclear-unspecified). Tuy nhiên, lưu ý rằng 'erase (begin(), end())' được chỉ định để mất thời gian bằng với lượng thời gian cần thiết để gọi mọi destructor. – nneonneo
Vâng .. nó nói rằng rõ ràng() là tuyến tính, nhưng chúng tôi cũng biết rằng nó gọi destructor của tất cả các mục ...
http://www.cplusplus.com/reference/vector/vector/clear/
gì nếu ist gọi destructor không tuyến tính?
Tuy nhiên, trên nguyên thủy destructor gọi là tuyến tính (hoặc liên tục, điều này không quan trọng trừ khi nó không phải là hơn tuyến tính)
nên có, về nguyên thủy là rõ ràng() luôn luôn là một hoạt động tuyến tính
OP yêu cầu cụ thể về nguyên thủy, có các destructors tầm thường. – nneonneo
Trường hợp nói nó là tuyến tính? Tôi không thể tìm thấy nó ở bất cứ nơi nào trong tiêu chuẩn C++ 11, nhưng tôi có thể thiếu một cái gì đó. – juanchopanza
@juanchopanza và nneonneo cố định – cIph3r
có thể trùng lặp của [phức tạp của std :: vector :: clear() khi T là một kiểu nguyên thủy là gì?] (http://stackoverflow.com/questions/11235975/what-is-the-complexity-of- stdvectortclear-when-t-is-a-nguyên thủy-type) –
nneonneo
có thể trùng lặp của [std :: vector :: rõ ràng, liên tục thời gian?] (http://stackoverflow.com/questions/14094302/stdvectorintclear-constant-time) –
jogojapan