www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - SList/DList ranges

reply "Zhenya" <zheny list.ru> writes:
Hi!
I read the spec,but I didn't find any function,that removes 
concrete element from
list.I am not familiar with D's ranges,so could you help me 
please?
Nov 26 2012
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
Zhenya:

 I read the spec,but I didn't find any function,that removes 
 concrete element from
 list.I am not familiar with D's ranges,so could you help me 
 please?
I suggest to take a look at the older threads similar to this one. And in most cases linked lists are not the right data structure to use. Bye, bearophile
Nov 26 2012
prev sibling parent reply Jonathan M Davis <jmdavisProg gmx.com> writes:
On Monday, November 26, 2012 19:49:51 Zhenya wrote:
 Hi!
 I read the spec,but I didn't find any function,that removes
 concrete element from
 list.I am not familiar with D's ranges,so could you help me
 please?
What do you mean by removing concrete elements? How is that any different from any other element in the list? If you want to remove elements from the list, then use one of the *remove functions. [] on the list to get a range over all of the elements in the list, find to find the element that you want, and then take to get a range with just the elements from the front of the range that you want to remove. Hopefully this will enlighten you somewhat: import std.algorithm; import std.container; import std.range; import std.stdio; void main() { auto list = make!(SList!int)(4, 5, 6, 7, 22, 9, 5, 4); assert(equal(list[], [4, 5, 6, 7, 22, 9, 5, 4])); auto found = find(list[], 6); assert(equal(found.save, [6, 7, 22, 9, 5, 4])); list.linearRemove(take(found, 3)); assert(equal(list[], [4, 5, 9, 5, 4])); list.linearRemove(take(find(list[], 5), 1)); assert(equal(list[], [4, 9, 5, 4])); } Unfortunately, std.container needs a fair bit of work in terms of some of the details - particularly with its functions which accept and/or return ranges, so it doesn't always work like it should yet. It's very much a work in progress right now. But the above should give you the basic idea. As for ranges in general, the best resource on them at this point would be this chapter from an online book on D: http://ddili.org/ders/d.en/ranges.html If you're going to be using Phobos much (which is likely if you're using D), then you're going to need to understand ranges, because Phobos uses them quite heavily. - Jonathan M Davis
Nov 26 2012
parent "Zhenya" <zheny list.ru> writes:
On Tuesday, 27 November 2012 at 07:51:16 UTC, Jonathan M Davis 
wrote:
 On Monday, November 26, 2012 19:49:51 Zhenya wrote:
 Hi!
 I read the spec,but I didn't find any function,that removes
 concrete element from
 list.I am not familiar with D's ranges,so could you help me
 please?
What do you mean by removing concrete elements? How is that any different from any other element in the list? If you want to remove elements from the list, then use one of the *remove functions. [] on the list to get a range over all of the elements in the list, find to find the element that you want, and then take to get a range with just the elements from the front of the range that you want to remove. Hopefully this will enlighten you somewhat: import std.algorithm; import std.container; import std.range; import std.stdio; void main() { auto list = make!(SList!int)(4, 5, 6, 7, 22, 9, 5, 4); assert(equal(list[], [4, 5, 6, 7, 22, 9, 5, 4])); auto found = find(list[], 6); assert(equal(found.save, [6, 7, 22, 9, 5, 4])); list.linearRemove(take(found, 3)); assert(equal(list[], [4, 5, 9, 5, 4])); list.linearRemove(take(find(list[], 5), 1)); assert(equal(list[], [4, 9, 5, 4])); } Unfortunately, std.container needs a fair bit of work in terms of some of the details - particularly with its functions which accept and/or return ranges, so it doesn't always work like it should yet. It's very much a work in progress right now. But the above should give you the basic idea. As for ranges in general, the best resource on them at this point would be this chapter from an online book on D: http://ddili.org/ders/d.en/ranges.html If you're going to be using Phobos much (which is likely if you're using D), then you're going to need to understand ranges, because Phobos uses them quite heavily. - Jonathan M Davis
Thank you,understood.I just want a container with fast insert/remove.Something like C++ std::list.But when I look at you example I understand that remove is linear,so maybe I need assosiative array or RedBlackTree. And thank you for a link,I will learn ranges surely.
Nov 27 2012