Re: Adding functions to generic package



Preben Randhol <randhol+valid_for_reply_from_news@xxxxxxx> writes:

> I have two different questions. How can one splice an element to the end
> of the list?

Just splice the element prior to the distinguished iterator value Back:

C : Container_Type;

procedure Op (I : Iterator_Type) is
begin
Splice (C, Before => Back (C), Iterator => I);
end;

Back is the iterator that designates the virtual element
one-beyond-the-end of the list.


> Mustn't one then Append it and Delete or call Splice twice; first
> moving the element to the second last place and then move the last
> place in front of it?

No; just splice the element to the position before Back. See above.


> Reading the source code I find that the Splice function can only
> splice an element before a given position.

Yes. But if you splice an element before Back, that's the same as
appending it.


> Another question. Why isn't there a Swap function in the library like
> the one that you have in the Reverse_Container? I can make something
> using two splices although a bit less effective I should imagine?

Hmmm, not sure what you're asking for. Swap exchanges the internal
linked lists of a pair of list containers. Reverse_Container reverses
the nodes on the internal linked lists of a single list container.

The list container has both of the these operations, so what operation
do you need, that you want to implement using splice?

Thinking about it more, I think that what you're asking for is an
operation to swap a pair of nodes in the list, a la the Swap_Links
operation in the Ada 200Y container library. I can add that operation,
if that's what you need. (I just need to make sure I understand your
request.)

Note that I would probably just implement it using Splice. That's what
I did in the standard container library reference implementation.

-Matt
.



Relevant Pages

  • Re: Effective STL Item 4 (size() vs. empty())
    ... >> Any other practical obstacle you have been encountering? ... The Osize leads to an Osplice ... source and destination lists are the same, ... to be able to keep iterators to specific items. ...
    (comp.lang.cpp)
  • std::list::size
    ... >> where this was hashed out was that constant time splicing was more ... > whole lists, or using splicing to rearrange a single list, which must cover ... Search it for uses of splice. ... Complexity: Constant time. ...
    (comp.lang.cpp)
  • Re: random array elements and speed
    ... initial elements JJ> then yeah the splice method might well be two or ... swapping and pop will blow that away for large lists. ... is even on moderately large arrays. ... Overwrite the chosen element with the last element, ...
    (comp.lang.perl.misc)
  • Re: Questions about destructors on std library containers
    ... >> With these implementations splice() is faster because they don't ... > sizeto be Oand allows splice on different lists to be O. ... constant complexity", it requires that splice has complexity ...
    (comp.lang.cpp)