[C++] Should the complexity of std::list::size() be O(n) or O(1)?

Howard Hinnant hhinnant@apple.com
Thu Nov 24 18:56:00 GMT 2005


On Nov 24, 2005, at 2:32 PM, Gabriel Dos Reis wrote:

> Since it was a mistake to put it there in the first place, why shall
> we penalize proper list operations by trying to make an error run  
> faster?

"Trying to make an error run faster" implies the wrong thing.  This  
statement is often stated as "why get the wrong answer faster", which  
is something I completely agree with.  An O(1) size doesn't compute  
the wrong answer.  It merely shifts a performance tradeoff.

The status quo (size() may be O(1) or O(N)) is unacceptable because  
people, even experts, will do things like this:

http://home.twcny.rr.com/hinnant/cpp_extensions/ 
On_list_size.html#boost%20survey

It just happens because c.size() is usually O(1) for most c.  We've  
been trained that way.  Having it sometimes be O(N) for some c is  
just error prone, especially in generic code (no different than  
strstream being technically correct and even really useful sometimes,  
but prone to misuse because of a poor interface design, leading to  
memory leaks).

If we want to prevent this mistake from occurring in the future, I  
see only two choices:

1.  Remove list::size.
2.  Make list::size O(1).

Pick the less evil.

Imho, adding a guaranteed O(1) "splice some from other" signature  
helps to make choice 2 a little more palatable.

-Howard



More information about the Libstdc++ mailing list