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
- 1. vector :: clear() tốn quá nhiều thời gian?
- 2. Có được chiều dài của một chuỗi một hoạt động liên tục thời gian không?
- 3. Trong khai báo "std :: vector <X> f();", là "std :: vector <X>" một instantiation?
- 4. Sắp xếp một std :: vector <std :: pair <std :: string, bool >> bởi chuỗi?
- 5. Bản sao nhanh của `std :: vector <std :: uint8_t>`
- 6. Vector của std :: function <>
- 7. Các thủ tục được lưu trữ là thời gian không liên tục!
- 8. Cách lưu `std :: vector <uchar>` vào `std :: ostream`?
- 9. Chuyển đổi std :: string thành std :: vector <char>
- 10. C++ std :: vector hoạt động như thế nào?
- 11. C++ Vector vs Array (Thời gian)
- 12. Chuyển đổi std :: vector <std :: vector <double>> đại diện cho mảng 2D thành cv :: Mat
- 13. std :: list vs std :: vector iteration
- 14. Là std :: vector hoặc boost :: vector thread safe?
- 15. OpenCV std :: vector <cv :: Point2f> để cv :: Mat
- 16. SQL GROUP BY: khoảng thời gian liên tục?
- 17. Chuyển std :: vector <int> mục sang hàm variadic
- 18. Thay thế 'std :: vector` với `std :: array`
- 19. Đặt thời gian hiện tại của thẻ <audio> không hoạt động?
- 20. std :: di chuyển giữa std :: string và std :: vector <unsigned char>
- 21. Nên tăng :: ptr_vector được sử dụng tại chỗ std :: vector tất cả các thời gian?
- 22. Thời gian hệ thống chrono C++ tính bằng mili giây, hoạt động thời gian
- 23. std :: vector <double> phá hủy ném SIGABRT
- 24. Cách "truyền" một tiêu chuẩn :: vector <char> tới tiêu chuẩn :: vector <wchar_t>
- 25. Căn chỉnh byte của các phần tử trong std :: vector <char> là gì?
- 26. Hành vi đúng cho std :: vector <T> :: value_type
- 27. std :: string hoặc std :: vector <char> để giữ dữ liệu thô
- 28. In một danh sách đơn lẻ liên kết ngược, trong không gian liên tục và thời gian tuyến tính
- 29. 'std :: vector <T> :: iterator it;' không biên dịch
- 30. Tại sao biên dịch hơn 100.000 dòng std :: vector :: push_back mất nhiều thời gian?
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