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