digitalmars.D.learn - Binary search in structs
- FreeSlave (19/19) Apr 05 2015 I have array of structs sorted by specific field. How can I
I have array of structs sorted by specific field. How can I
perform binary search using this field as a key?
Currently I ended up with this, but it gives error:
struct S
{
int i;
string s;
}
import std.range;
void main(string [] args)
{
S[] structs = [{1,"hello"}, {2,"world"}, {3, "!"}]; //sorted
by i
auto sortedRange = assumeSorted!(function bool(ref const S
item, int needle) {
return item.i < needle;
})(structs);
sortedRange.trisect(2); //compilation error
}
Apr 05 2015
On Sunday, 5 April 2015 at 23:06:27 UTC, FreeSlave wrote:
I have array of structs sorted by specific field. How can I
perform binary search using this field as a key?
Currently I ended up with this, but it gives error:
struct S
{
int i;
string s;
}
import std.range;
void main(string [] args)
{
S[] structs = [{1,"hello"}, {2,"world"}, {3, "!"}];
//sorted by i
auto sortedRange = assumeSorted!(function bool(ref const S
item, int needle) {
return item.i < needle;
})(structs);
sortedRange.trisect(2); //compilation error
}
I believe you have to pass trisect a value of S. So S(2, "")
would do here, I suppose.
Apr 05 2015
On Sunday, 5 April 2015 at 23:15:04 UTC, w0rp wrote:On Sunday, 5 April 2015 at 23:06:27 UTC, FreeSlave wrote:Of course I could pass dummy object, but this is ugly solution. I hoped there's some better one.I have array of structs sorted by specific field. How can I perform binary search using this field as a key? Currently I ended up with this, but it gives error: struct S { int i; string s; } import std.range; void main(string [] args) { S[] structs = [{1,"hello"}, {2,"world"}, {3, "!"}]; //sorted by i auto sortedRange = assumeSorted!(function bool(ref const S item, int needle) { return item.i < needle; })(structs); sortedRange.trisect(2); //compilation error }I believe you have to pass trisect a value of S. So S(2, "") would do here, I suppose.
Apr 05 2015
I think I found solution using opBinaryRight
import std.range;
struct S
{
int i;
string s;
int opCmp(int i) {
return this.i - i;
}
int opCmp(ref const S s) {
return this.i - s.i;
}
int opBinaryRight(string op)(int i) if (op == "<") {
return i - this.i;
}
}
void main(string [] args)
{
S[] structs = [{1,"hello"}, {2,"world"}, {3, "!"}]; //sorted
by i
auto sortedRange = assumeSorted(structs);
auto t = sortedRange.trisect(2);
}
Apr 06 2015








"FreeSlave" <freeslave93 gmail.com>