我在 D 的标准库中四处寻找 Set 实现,我只找到了这些:
- 二叉堆
- 红黑树
如果我能弄清楚如何使用它们,它们都可以正常工作。我从 RedBlackTree 开始(因为我已经熟悉它们的工作方式),这就是我想出的:
auto rbt = redBlackTree!string();
foreach(s; setOfStrings) {
rbt.insert(s);
}
foreach(s; rbt) {
if (s[0 .. 3] == "sth") {
rbt.removeKey(s);
}
}
我知道我可以在第一个 foreach 中完成条件,但这只是一个示例,表明我需要在 Set 中添加和删除元素。这可行,但我得到编译错误:
错误:模板 std.container.RedBlackTree!(string).RedBlackTree.removeKey(U) if (isImplicitlyConvertible!(U,Elem)) 不匹配任何函数模板声明
错误:模板 std.container.RedBlackTree!(string).RedBlackTree.removeKey(U) if (isImplicitlyConvertible!(U,Elem)) 无法从参数类型推导出模板函数 !()(string
我不需要红黑树(没有重复的任何东西),速度也不是很重要。我可以做这样的事情:
string[] arr;
foreach(s; setOfStrings) {
// check for duplicate code here...
arr ~= s;
}
for(int i = 0; i < arr.length; i++) {
if (s[0 .. 3] == "sth") {
arr = arr[0 .. i] ~ arr[i + 1 .. $];
i++;
}
}
标准库中是否有任何用于简单 Set 的内容?