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.