2013-02-20 27 views
11

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?

+1

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

+0

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

Trả lời

2

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ớ

+4

Ít nhất bằng cách sử dụng default allocator, 'std :: vector' sẽ không sử dụng' delete [] internalPtr; '. –

4

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).

+0

Đ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

+0

@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

0

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

+0

OP yêu cầu cụ thể về nguyên thủy, có các destructors tầm thường. – nneonneo

+1

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

+0

@juanchopanza và nneonneo cố định – cIph3r

Các vấn đề liên quan