Isn't using find with retro awkward?
jam
gr0v3er+d at gmail.com
Wed Feb 16 12:42:53 PST 2011
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.
More information about the Digitalmars-d-learn
mailing list