
on Mon Dec 10 2007, "Daniel James" <daniel_james-AT-fmail.co.uk> wrote:
On 10/12/2007, Thorsten Ottosen <thorsten.ottosen@dezide.com> wrote:
Daniel James skrev:
This implementation actually does provide the no throw guarantee. But Jeremy Maitin-Shepard's version (on which it is based) didn't because the iterators didn't store the bucket, and required the hash to be calculated to work out which bucket the elements to be deleted are in. Which I think the standard allows.
Ok, I think you right the standard allows that. But this is also a bit irritating, because I cannot portable take advantage of your stronger guarantee. feThis again begs the question of how much the stronger guarantee affects performance?
I don't think it affects performance at all, I think if it was required it would reduce the implementation choices. For example, if a container could rehash without invalidating iterators then I think it can currently do that when erase is called, but not if the stronger guarantee is required and hash can throw.
Also, I made a mistake in the documentation, I said that a call to Hash or Pred can throw. But re-reading the standard, it looks like it doesn't have to be a call, it can be any member of the function objects.
yes, but my question was: *if an exception is thrown*, then what? I assume you give the basic guarantee?
Sorry, I misunderstood. This implementation gives the strong guarantee, the standard gives the basic guarantee.
I hope this implementation isn't sacrificing performance to get that strong guarantee. -- Dave Abrahams Boost Consulting http://www.boost-consulting.com