containers, iteration, and removal

monarch_dodra monarchdodra at gmail.com
Wed Aug 1 05:54:42 PDT 2012


On Wednesday, 1 August 2012 at 07:44:49 UTC, Ellery Newcomer 
wrote:
> I also take (erk) issue with the implementation of 
> linearRemove. It depends on an interface from the container 
> range that is not part of the general range interface. This 
> poses problems. You can't wrap the container range with another 
> range and pass the result to linearRemove. The special 
> interface is gone. Case in point, there is a specific overload 
> for Take!Range, which also uses nonstandard interface.

Err, in C++ neither.

If you want to remove an element from a vector, you use 
"vector::iterator". A *would be* filter_iterator wouldn't work.

----
Regarding the "special overload", it is only present for 
containers that don't provide ranges with opSlice, such as DList.

Now in C++, you'd have both functions for containers:
Remove(it); //Removes element at it
and
Remove(first, last)//removes the range

In D, you also have 1-2 functions, but they carry the same name:

Remove(range); //removes the range.
Remove(Take!Range); //Optional: removes elements from the take 
range.

If you compare both, you'll see (IMO) that not only does the 
interface provided by D gives just as much functionality for no 
extra cost, it also provides MORE functionality:
In the case of forwardRange, remove(Take!Range) can be used to 
delete an indiscriminate amount of elements, not just one!
C++ doesn't have that, and neither does java, I believe.

----
But I'll kind of agree, in C++ just like in D, while 
iterators/ranges work nice when you manipulate just them, you 
always lose a bit of abstraction when you want to re-interface 
with the underlying container.


More information about the Digitalmars-d mailing list