Steven Schveighoffer wrote:
On Mon, 08 Mar 2010 12:53:40 -0500, Andrei Alexandrescu <[email protected]> wrote:

Steven Schveighoffer wrote:
On Sun, 07 Mar 2010 12:43:09 -0500, Robert Jacques <[email protected]> wrote:

On Sun, 07 Mar 2010 08:23:03 -0500, Steven Schveighoffer <[email protected]> wrote:
What is the advantage? Why would an algorithm require soft functions? What is an example of such an algorithm?

Something that uses toUpperCase or toLowerCase, for example.
I guess I won't get a real example. I'm not sure it matters. When Andrei starts implementing the soft methods, either they will be a huge win or obviously useless. If I were a betting man, I'd bet on the latter, but I'm not really good at betting, and Andrei's ideas are usually good :)

The way people usually take advantage of non-invalidating container primitives is altering the container during an iteration. The canonical way to remove while iterating an erase-non-invalidating container (e.g. map) is this:

typedef ... Container;
Container c;
for (Container::iterator i = c.begin(); i != c.end(); )
{
     if (should_delete_this_guy)
         c.remove(i++);
     else
         ++i;
}

The canonical way to remove while iterating an erase-invalidating container (e.g. vector) is:

typedef ... Container;
Container c;
for (Container::iterator i = c.begin(); i != c.end(); )
{
     if (should_delete_this_guy)
         i = c.remove(i);
     else
         ++i;
}

Hm... this seems to be a different problem than I originally was thinking about. So in essence, you want a set of "safe" functions that will not adversely affect a range you are using to iterate with?

That's the idea. Any documentation of STL containers specifies whether iterators are invalidated or not by a primitive. The plan is to simply define a nomenclature (i.e. "softXxx") for primitives that don't invalidate iterators. That moves the documentation into the name of the function.

BTW, I solved this problem (removing while iterating) in a much better/simpler way in dcollections.

Do tell!


Andrei

Reply via email to