std::list::size() Complexity: Demystified
While commonly perceived as linear, the complexity of std::list::size() is surprisingly nuanced. Initially, its complexity was left unspecified in the C standard, leading to implementation-dependent variations.
Implementation-Specific Discrepancies
In Microsoft Visual Studio V6, std::list::size() is implemented as a constant-time operation, adhering to the {return (_Size);} scheme. However, gcc versions 3.3.2 to 4.1.0 employed an O(N) algorithm: { return std::distance(begin(), end()); }. This difference stemmed from using the distance function, which requires traversing the entire list.
Standardization in C 11
A crucial shift occurred in C 11, where the standard mandates that .size() must exhibit "constant" complexity for all standard containers, including std::list. This effectively eliminates the previous implementation disparities.
GCC Implementation Lag
Despite this standardization, libstdc in gcc versions prior to 4.8 continued to use the O(N) algorithm for .size() in std::list. This decision was partly attributed to potential performance implications of altering the algorithm.
Updates and Improvements
The situation improved significantly in gcc 5.0 and later, where std::list::size() was finally optimized to O(1) when compiled in C 11 mode.
Libc Implementation
In libc , the .size() function in std::list is consistently O(1). This is facilitated by a compressed pair data structure used to track the size of the list, ensuring efficient and rapid size retrieval.
In conclusion, while the complexity of std::list::size() was historically implementation-dependent, the C 11 standard has standardized it to O(1) for all conforming implementations. Implementation details may vary among different compilers and versions, but the underlying requirement for constant-time complexity remains.
The above is the detailed content of What is the Time Complexity of `std::list::size()` in Different C Versions?. For more information, please follow other related articles on the PHP Chinese website!