Topic: Defect Report: a.insert(p,t) is incorrectly specified


Author: "Mark Rodgers" <mark.rodgers@cadenza.co.nz>
Date: 2000/05/19
Raw View
 [Moderator's note: this defect report has been forwarded to
 the C++ committee.  -moderator.]

Section 23.1.2 [lib.associative.reqmts] paragraph 7 (table 69)

Closed issue 192 raised several problems with the specification of
this function, but was rejected as Not A Defect because it was too big
a change with unacceptable impacts on existing implementations.
However, issues remain that could be addressed with a smaller change
and with little or no consequent impact.

Issues:

1. The specification is inconsistent with the original proposal and
   with several implementations.

   The initial implementation by Hewlett Packard only ever looked
   immediately _before_  p, and I do not believe there was any
   intention to standardise anything other than this behaviour.
   Consequently, current implementations by several leading
   implementers also look immediately before p, and will only
   insert after p in logarithmic time.  I am only aware of one
   implementation that does actually look after p, and it
   looks before p as well.  It is therefore doubtful that existing
   code would be relying on the behaviour defined in the standard,
   and it would seem that fixing this defect as proposed below would
   standardise existing practice.

2. The specification is inconsistent with insertion for sequence
   containers.

   This is difficult and confusing to teach to newcomers.  All
   insert operations that specify an iterator as an insertion
   location should have a consistent meaning for the location
   represented by that iterator.

3. As specified, there is no way to hint that the insertion should
   occur at the beginning of the container, and the way to hint
   that it should occur at the end is long winded and unnatural.

   For a container containing n elements, there are n+1 possible
   insertion locations and n+1 valid iterators.  For there to
   be a one-to-one mapping between iterators and insertion locations,
   the iterator must represent an insertion location immediately
   before the iterator.

4. When appending sorted ranges using insert_iterators, insertions
   are guaranteed to be sub-optimal.

   In such a situation, the optimum location for insertion is
   always immediately after the element previously inserted.  The
   mechanics of the insert iterator guarantee that it will try and
   insert after the element after that, which will never be correct.
   However, if the  container first tried to insert before the
   hint, all insertions would be performed in amortised constant
   time.

Proposed Resolution

In 23.1.2 [lib.associative.reqmts] paragraph 7, table 69, make
the following changes in the row for a.insert(p,t):

assertion/note pre/post condition

  Change the last sentence from

     "iterator p is a hint pointing to where the insert should
     start to search."

  to

     "iterator p is a hint indicating that immediately before p
     may be a correct location where the insertion could occur."

complexity

  Change the words "right after" to "immediately before".
---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://reality.sgi.com/austern_mti/std-c++/faq.html              ]





Author: "Gillmer J. Derge" <gderge1@nycap.rr.com>
Date: 2000/05/24
Raw View
Mark Rodgers wrote:

> Issues:
>
> 4. When appending sorted ranges using insert_iterators, insertions
>    are guaranteed to be sub-optimal.
>
>    In such a situation, the optimum location for insertion is
>    always immediately after the element previously inserted.  The
>    mechanics of the insert iterator guarantee that it will try and
>    insert after the element after that, which will never be correct.
>    However, if the  container first tried to insert before the
>    hint, all insertions would be performed in amortised constant
>    time.

This is a nit, but isn't nitpicking sort of the purpose of language
standards?

It seems that this case is not so much "guaranteed to be sub-optimal" as it
is permitted to be sub-optimal at the implementor's discretion.  Take the
case of an implementation that checks both before and after the hint.  Such
an implementation is conforming (according to the current standard) but also
provides amortized constant (optimal) performance for appending sorted
ranges.  The problem with the current standard is not that it prohibits this
behavior but that it does not require it.

-----
Gillmer J. Derge

---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://reality.sgi.com/austern_mti/std-c++/faq.html              ]






Author: Pete Becker <petebecker@acm.org>
Date: 2000/05/24
Raw View
"Gillmer J. Derge" wrote:
>
> This is a nit, but isn't nitpicking sort of the purpose of language
> standards?
>

No, it's a side effect.

--
Pete Becker
Dinkumware, Ltd. (http://www.dinkumware.com)
Contibuting Editor, C/C++ Users Journal (http://www.cuj.com)

---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://reality.sgi.com/austern_mti/std-c++/faq.html              ]