Thread overview
How to remove the key from the `redBlackTree` with comparator" a <= b "?
Jun 07, 2015
Dennis Ritchie
Jun 07, 2015
anonymous
Jun 07, 2015
Dennis Ritchie
Jun 07, 2015
anonymous
Jun 07, 2015
Dennis Ritchie
Jun 08, 2015
Per Nordlöw
June 07, 2015
I understand that `removeKey` works only with the comparator "a < b":
http://dlang.org/phobos/std_container_rbtree.html#.RedBlackTree.removeKey
>Removes elements from the container that are equal to the given values according to the less comparator.

How do I remove the key from the `redBlackTree` with comparator "a <= b" ?

auto rbt = redBlackTree!("a <= b", int)(1, 2, 3, 4, 5, 6, 7);
rbt.removeKey(6);

foreach (key; rbt)
    write(key);
// prints 1234567
June 07, 2015
On Sunday, 7 June 2015 at 18:42:58 UTC, Dennis Ritchie wrote:
> How do I remove the key from the `redBlackTree` with comparator "a <= b" ?

Do not use '<=' as a comparison function with RedBlackTree. It doesn't meet the requirements.

Quoting the documentation [1]:
> Note that less should produce a strict ordering. That is, for two unequal elements a and b, less(a, b) == !less(b, a). less(a, a) should always equal false.

This doesn't hold for '<='.
June 07, 2015
On Sunday, 7 June 2015 at 18:50:47 UTC, anonymous wrote:
> On Sunday, 7 June 2015 at 18:42:58 UTC, Dennis Ritchie wrote:
>> How do I remove the key from the `redBlackTree` with comparator "a <= b" ?
>
> Do not use '<=' as a comparison function with RedBlackTree. It doesn't meet the requirements.
>
> Quoting the documentation [1]:
>> Note that less should produce a strict ordering. That is, for two unequal elements a and b, less(a, b) == !less(b, a). less(a, a) should always equal false.
>
> This doesn't hold for '<='.

OK. But I want to return a `upperBound` segment with the included `key`. It does not suit me:

auto rbt = redBlackTree!("a < b", int)(1, 2, 3, 4, 5);
writeln(rbt.upperBound(3)); // prints [4, 5]

I want it to be so:

auto rbt = redBlackTree!("a <= b", int)(1, 2, 3, 4, 5);
writeln(rbt.upperBound(3)); // prints [3, 4, 5]

How do I do with the comparator "a < b" ?
June 07, 2015
On Sunday, 7 June 2015 at 19:04:08 UTC, Dennis Ritchie wrote:
> OK. But I want to return a `upperBound` segment with the included `key`. It does not suit me:
>
> auto rbt = redBlackTree!("a < b", int)(1, 2, 3, 4, 5);
> writeln(rbt.upperBound(3)); // prints [4, 5]
>
> I want it to be so:
>
> auto rbt = redBlackTree!("a <= b", int)(1, 2, 3, 4, 5);
> writeln(rbt.upperBound(3)); // prints [3, 4, 5]
>
> How do I do with the comparator "a < b" ?

Use equalRange to get the elements that equal 3, too:
writeln(std.range.chain(rbt.equalRange(3), rbt.upperBound(3)));

June 07, 2015
On Sunday, 7 June 2015 at 19:11:25 UTC, anonymous wrote:
> On Sunday, 7 June 2015 at 19:04:08 UTC, Dennis Ritchie wrote:
>> auto rbt = redBlackTree!("a <= b", int)(1, 2, 3, 4, 5);
>> writeln(rbt.upperBound(3)); // prints [3, 4, 5]
>>
>> How do I do with the comparator "a < b" ?
>
> Use equalRange to get the elements that equal 3, too:
> writeln(std.range.chain(rbt.equalRange(3), rbt.upperBound(3)));

Thank you!
June 08, 2015
On Sunday, 7 June 2015 at 18:50:47 UTC, anonymous wrote:
> Do not use '<=' as a comparison function with RedBlackTree. It doesn't meet the requirements.
>
> Quoting the documentation [1]:
>> Note that less should produce a strict ordering. That is, for two unequal elements a and b, less(a, b) == !less(b, a). less(a, a) should always equal false.
>
> This doesn't hold for '<='.

Could we add a static check for this?
June 08, 2015
On 6/8/15 6:53 AM, "Per =?UTF-8?B?Tm9yZGzDtnci?= <per.nordlow@gmail.com>" wrote:
> On Sunday, 7 June 2015 at 18:50:47 UTC, anonymous wrote:
>> Do not use '<=' as a comparison function with RedBlackTree. It doesn't
>> meet the requirements.
>>
>> Quoting the documentation [1]:
>>> Note that less should produce a strict ordering. That is, for two
>>> unequal elements a and b, less(a, b) == !less(b, a). less(a, a)
>>> should always equal false.
>>
>> This doesn't hold for '<='.
>
> Could we add a static check for this?

How would a static check generate a and b generically?

-Steve