Re: Exception safety: how to assign std::string when strong guarantee is needed?
Roman.Perepelitsa@gmail.com ha scritto:
Interesting. I guess you're right! Sounds like an elegant solution,
too. Of course there's a drawback that reserve() may not always shrink
the string, if possible. But OTOH, this approach (reserve+assign) will
usually be very fast when the capacity of the destination string happens
to be big enough already beforehand...
What makes you think plain string2.assign(string1) does not provide
strong exception safety guarantee? I believe, assign should have
effect like
the following code:
basic_string& assign(const basic_string& s)
{
reserve(s.size());
copy(s.begin(), s.end(), begin());
return *this;
}
Unfortunately, this code won't work, because reserve() doesn't change
the size the of the string to match s.size(). You could use resize()
instead, but it would be suboptimal because if the string is grown, you
would end up initializing the added characters and then immediately
overwriting them. Most probably a real-life implementation of assign()
will access the string internals directly instead of relying on the
public interface only.
Anyway, I agree that assign might be implemented in a way that provides
the strong guarantee. The fact is that the standard (not even the latest
draft) mandates such implementation.
Probably, the only method of assignment which does not provide
strong exception safety guarantee, is assign(s.begin(), s.end()),
because it accepts InputIterators. Implementation of this method,
which only provides basic guarantee, probably will be faster than
the one with strong guarantee. I'm not sure though.
I doubt that an implementation taking InputIterators can be faster,
because it definitely needs to grow the string one char at the time,
possibly requiring multiple re-allocations. However, a good
implementation might provide a specialization of assign() for
ForwardIterators that computes the size of the final string with
distance() and then perform one reallocation only.
Just my 2 eurocent,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]