Isn't using find with retro awkward?

spir denis.spir at gmail.com
Wed Feb 16 14:06:57 PST 2011


On 02/16/2011 09:42 PM, jam wrote:
> On Wed, 16 Feb 2011 20:24:36 +0100, Andrej Mitrovic wrote:
>
>> The only thing I could come up with is exhausting the entire range to
>> get the length of a bidirectional range. But that's inefficient. Anyway
>> here's the dull thing:
>>
>> import std.stdio;
>> import std.range;
>> import std.array;
>>
>> R findBack(alias pred = "a == b", R, E)(R haystack, E needle)
>>      if (isBidirectionalRange!R)
>> {
>>      size_t index;
>>      bool found;
>>      auto saved = haystack;
>>
>>      foreach (item; retro(haystack))
>>      {
>>          if (item == needle)
>>          {
>>              found = true;
>>              index++;
>>              break;
>>          }
>>          index++;
>>      }
>>
>>      if (found)
>>      {
>>          size_t newIndex;
>>          while (!haystack.empty)
>>          {
>>              newIndex++;
>>              haystack.popBack;
>>          }
>>
>>          newIndex -= index;
>>          while (!saved.empty&&  newIndex)
>>          {
>>              saved.popFront;
>>              newIndex--;
>>          }
>>      }
>>
>>      return saved;
>> }
>>
>> void main()
>> {
>>      auto orig = [4, 0, 4, 0];
>>      auto result = findBack(orig, 4);
>>
>>      assert(array(result) == [4, 0]);
>>
>>      result.front = 10;
>>      assert(orig == [4, 0, 10, 0]);
>> }
>>
>> You'll have to forgive me but I have yet to study algorithms properly.
>> :)
>
> import std.stdio,std.algorithm,std.range;
>
> void main()
> {
>      auto a = [5,1,2,3,4,5,1];
>      auto index = countUntil(retro(a),5);
>      writeln(a[a.length-1-index .. a.length]);
> }
>
> outputs:
>
> [5,1]
>
> but yeah, it is a little awkward.

And you're assuming the range is slice-able (I mean at arbitrary position, 
witout popping it); which you cannot do in the general case.

Denis
-- 
_________________
vita es estrany
spir.wikidot.com



More information about the Digitalmars-d-learn mailing list