Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2008-06-26 10:51:22


Niels Dekker - mail address until 2008-12-31 wrote:
>> Howard Hinnant wrote:
>> swap1 time is 0.172796 seconds
>> swap2 time is 1.3e-05 seconds
>
> David Abrahams wrote:
>> Your program gives about the results I'd have expected for the case
>> you tested, but it doesn't address what I was concerned about.
>
> Howard's example shows that a swap overload for std::tr1::array
> effectively reduces the complexity of swapping a
> tr1::array<vector<int>,N> from O(M*N) to O(N), when the array has N
> vectors, each having size M. And it provides no-throw.

I know what it shows.

> Aren't those the issues you were concerned about?

No. swap for a given array<> is not guaranteed to be nothrow unless all
the elements have a nothrow swap. But I guess in a world where all
swaps are nothrow, this is a non-issue.

But the efficiency is a different issue. It's like the same reason we
don't provide random access for list iterators: operator++ on an
iterator is supposed to be fundamentally O(1) (notwithstanding
filter_iterator -- how do you measure /that/?!)

I am inclined to agree that a fast swap for array is useful and thus
should be provided, but I still have a nagging doubt about whether it's
"the right thing to do." Maybe I've been brainwashed by a certain
disciple of Alex Stepanov's, because nobody else seems to share that
doubt... so feel free to ignore me if you're unconvinced.

> Any type that is both CopyConstructible and Assignable is Swappable, by
> definition.

Unless you define Swappable to mean "has an O(1) swap." or unless you
meant "by implementation" instead of "by definition" ;-)

> Within generic code, people typically use the well-known
> idiom to swap a pair of Swappable objects:
>
> // Allow argument-dependent lookup to find a custom swap.
> using std::swap;
> swap(lhs, rhs);
>
> As long as boost::swap hasn't come out of the sandbox, of course
> (hint)!

??

> Don't you think it /always/ makes sense to provide a custom
> swap overload for a Swappable type, as long as it outperforms the
> default std::swap, in one way or the other?

That's the whole question. I'm not 100% sure.

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk