Adding item to a rbtree with a custom binaryFun
Adnan
relay.public.adnan at outlook.com
Tue Apr 14 00:31:19 UTC 2020
On Monday, 13 April 2020 at 23:59:20 UTC, Adnan wrote:
> I want to keep an ordered set of records and the standard
> provides me with RedBlackTree. The record is of type
> Tuple!(string, uint). Here's what it looks like:
>
> import std.json : parseJSON;
>
> uint[string] wordTable;
> import std.datetime.stopwatch : StopWatch, AutoStart;
>
> auto sw = StopWatch(AutoStart.yes);
> const auto j = parseJSON(get(link));
> const long downloadTime = sw.peek.total!"msecs";
>
> import std.typecons : Tuple, tuple;
> import std.container.rbtree : RedBlackTree;
> import std.functional : binaryFun;
>
> RedBlackTree!(Tuple!(string, uint), binaryFun!("a[1] > b[1]"))
> records;
>
> foreach (node; j["posts"].array()) {
> import std.stdio : writeln;
> import std.utf : decode;
>
> if ("com" in node) {
> import std.algorithm : splitter;
>
> foreach (word; getStr(node["com"].str()).splitter(' ')) {
> import std.string : strip;
>
> if (word.strip().length > 0)
> wordTable.require(word, 0)++;
>
> records ~= (tuple(word, wordTable[word])); // error
> }
> }
> }
>
> Now primarily I used `insert()` method to add a record to the
> records but it causes segfault in runtime. So I decided to use
> ~= to see what's going on. Here's what the compiler says:
>
> Error: cannot append type Tuple!(string, uint) to type
> std.container.rbtree.RedBlackTree!(Tuple!(string, uint),
> binaryFun, false)
>
>
> So the gist of the question is, if I have an RedBlackTree with
> a custom binaryFun, how can I add tuples to it?
I also tried creating a new type:
struct Record {
string k;
uint v;
int opCmp(ref const Record other) const {
return v - other.v;
}
}
bool less(Record a, Record b) {
return a < b;
}
RedBlackTree!(Record) records;
foreach (node; j["posts"].array()) {
import std.utf : decode;
if ("com" in node) {
import std.algorithm : splitter;
foreach (word; getStr(node["com"].str()).splitter(' ')) {
import std.string : strip;
if (word.strip().length > 0)
wordTable.require(word, 0)++;
records ~= Record(word, wordTable[word]);
}
}
}
Compiler says:
Error: cannot append type Record to type
std.container.rbtree.RedBlackTree!(Recor
d, "a < b", false)
source/app.d(153,18): Error: no [] operator overload for type
Record
source/app.d(157,58): Error: no [] operator overload for type
Record
source/app.d(158,40): Error: no [] operator overload for type
Record
More information about the Digitalmars-d-learn
mailing list