我想知道如何在C++中实现一个集合.如果我在不使用STL提供的容器的情况下实现自己的set容器,那么最好的方法是什么呢?
我理解STL集基于二叉搜索树的抽象数据结构.那么底层数据结构是什么?数组?
另外,如何insert()为一组工作?set如何检查元素是否已经存在?
我在维基百科上读到,实现集合的另一种方法是使用哈希表.这怎么样?
有人能告诉我一个快速的例子,说明如何ArrayList使用新的lambda语法在Java 8中按字母顺序排序.
这是故事.我创建了一个界面IVehicle.我明确地在我的类中实现了接口Vehicle.cs.
这是我的界面:
Interface IVehicle
{
int getWheel();
}
Run Code Online (Sandbox Code Playgroud)
这是我的班级:
class Vehicle: IVehicle
{
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(getWheel());
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这getWheel()是明确实现的.现在,当我尝试在我的Vehicle类中调用该方法时,我收到一个错误,指示getWheel()当前上下文中不存在该错误.有人能帮助我理解我做错了什么吗?
我很想知道,我如何在Java中实现概率?例如,如果显示变量的可能性是1/25,那么我该如何实现呢?或任何其他概率?请指出我的总体方向.
如果我们查看Java Object类,那么我们可以找到一些方法,如:
public native int hashCode()
protected native Object clone()
Run Code Online (Sandbox Code Playgroud)
这些本地人是什么?这些方法如何运作?
检查项目是否在列表中的简单方法是什么?
就像是
(in item list)
Run Code Online (Sandbox Code Playgroud)
可能返回true如果item=1和list=(5 9 1 2)和false,如果item=7
我习惯性地HashMap在我的程序中使用,因为我知道它通常是最有效的(如果使用得当)并且可以轻松应对大型地图.我知道EnumMap哪个对于枚举键非常有用,但是我经常会生成一个永远不会很大的小地图,很快就会被丢弃,并且没有并发问题.
HashMap<K,V>这些小型,本地和临时用途是否过于复杂?在这些情况下,我可以使用另一个简单的实现吗?
我想我在寻找一个Map它类似于实施ArrayList的List.它存在吗?
在回复之后添加:
这是一个缓慢但非常简单的实现可能更好的场景- 当我有很多很多这样Map的时候.例如,假设我有一百万左右的这些微小的小地图,每个地图都有少量(通常少于三个)条目.我的参考率很低 - 也许我实际上并没有在大部分时间丢弃之前引用它们.它仍然HashMap是最好的选择吗?
资源利用率不仅仅是速度 - 例如,我想要的东西不会破坏堆积很多并且使GC需要很长时间.
这可能HashMap是正确的答案,但这不是过早优化的情况(或者至少可能不是).
经过一番思考后添加了很多:
我决定手工编写自己的代码SmallMap.很容易制作一个AbstractMap.我还添加了几个构造函数,以便SmallMap可以从现有构造中构造Map.
在此过程中,我不得不决定如何表示Entrys并实现SmallSet该entrySet方法.
我通过编码(并对其进行单元测试)学到了很多东西,并希望分享这个,以防其他人想要一个.它在github 这里.
我then()在Herb Sutter的演讲中有一些关于函数实现的问题.此函数用于链接异步操作,参数f是一个操作的未来,参数w是此操作的"工作"(lambda).
template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
return async([=]{ w(f.get()); });
}
Run Code Online (Sandbox Code Playgroud)
申请的一个例子是:
std::future<int> f = std::async([]{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});
auto f2 = then(std::move(f), [](int i){
return 2 * i;
});
Run Code Online (Sandbox Code Playgroud)
主线程产生任务但不等待它们中的任何一个完成.
首先,future<T>没有复制构造函数.这意味着,shared_future<T>除非我们将调用更改async()为将未来移动到lambda ,否则建议的实现只能用于.这个问题提出了一种方法,但似乎太复杂了.我重新实现了这个功能,我想知道我的代码是否正确或是否遗漏了一些东西......
其次,传递给then()函数的未来可能是void这样,我们实际上需要2个实现then(),对吧?一个用于期货回归T,一个用于期货回归void.
最后,如果body内的lambda then()没有return语句,那么我们实际上可以返回值吗?如果没有return语句,那么返回future<void>吧?
我试图解决上述问题,这就是我想出的.这是对的吗?
template <typename T, typename …Run Code Online (Sandbox Code Playgroud) 好的,所以这是我的ArrayList:
private List<ClientThread> clients = new ArrayList<ClientThread>();
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的事情:
我正在尝试删除ArrayList上面发布的最后一个已知项目.我正在尝试使用以下代码执行此操作:
} catch(SocketException re) {
String hey = clients.get(clients.size());
ClientThread.remove(hey);
System.out.println(hey + " has logged out.");
System.out.println("CONNECTED PLAYERS: " + clients.size());
}
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
C:\wamp\www\mystikrpg\Server.java:147: incompatible types
found : Server.ClientThread
required: java.lang.String
String hey = clients.get(clients.size());
^
C:\wamp\www\mystikrpg\Server.java:148: cannot find symbol
symbol : method remove(java.lang.String)
location: class Server.ClientThread
ClientThread.remove(hey);
^
2 errors
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?它应该删除我的最后一个已知项目ArrayList.
java ×5
c++ ×2
arraylist ×1
asynchronous ×1
c# ×1
c++11 ×1
collections ×1
common-lisp ×1
concurrency ×1
dictionary ×1
explicit ×1
interface ×1
java-8 ×1
lambda ×1
lisp ×1
list ×1
mysql ×1
probability ×1
set ×1
sql ×1