我正在阅读 Shaffer 的 Data Structures and Algorithm Analysis in C++(可在https://people.cs.vt.edu/shaffer/Book/免费获得),因为我看到它使用模板,我正在尝试了解更多关于C++ 和 C++ 中的泛型编程。
当作者介绍链表时,他给出了一个使用自由列表的变体。(这是大约第 111 页,pdf 第 130 页)。在他的实现中,他为 a 创建了一个类Link
并覆盖operator new
以从空闲列表中提取。然后有一个班级LinkedList
。
然而,事实证明,在这个实现中,调用new LinkedList
会导致构造函数被同一个对象调用两次,我很难弄清楚为什么。
此代码显示了示例的相关部分。
#include <cstddef>
#include <iostream>
struct S {
S() { std::cout << "ctor at " << this << "\n"; }
~S() { std::cout << "dtor at " << this << "\n"; }
};
class Link {
private:
static Link * freelist;
S elem;
Link * next; …
Run Code Online (Sandbox Code Playgroud) 现在我正在使用vim中的自动完成功能,我已经选择了supertab来处理我的完成情况.虽然它的运行非常顺利(我认为)正如它的设计,我想知道如何改变一些东西.
首先,我在Ubuntu 12.04LTS上运行7.3.429
set completeopt=menuone,preview,longest
Run Code Online (Sandbox Code Playgroud)
所以我有supertab的bash类型自动完成,默认完成.
假设我的文件中有以下内容:
aaabbbcccddd
aaabbccddeef
aaabbcddeeff
Run Code Online (Sandbox Code Playgroud)
如果我输入aa
并点击Tab,则vim意识到这aaabb
是匹配中最长的常见字符串,因此它插入aaabb
并显示包含三个选项的菜单.如果我确实想要其中一个选项,那么一切都很好.但也许我真的想要aaaaazzzzz
,但没有意识到我还没有输入它.
是否有一个很好的方式来对vim说:"哦,我很抱歉!毕竟我并不是要完成任务!请假装我没有."
现在,对我来说明显的选择是:
如果我没有longest
启用,那么我可以使用Ctrl+ E,它退出菜单而不插入任何其他内容.但是,由于最长时间打开,它会停止自动完成,但会保留输入的最长公共匹配.
当然必须有更好的方法来做到这一点.
假设我想在python中创建一个非常简单的程序,指示按下一个键的时间.因此,如果我键入并按住j
键片一会儿,我正在寻找一个能够显示信息的程序the key 'j' was pressed for 1.1 seconds
.
根据我的理解,应该实现的方式是检测KEYDOWN事件和KEYUP事件并对其加时间戳,并对时间戳进行适当的减法.因此,检测KEYDOWN和KEYUP事件就足够了.
关于检测单个按键或检测单个字符输入的SO有各种各样的问题和答案,例如这一个或这个,它们都使用某种形式的getch.我查看了python curses库,从我可以看出,密钥检测的主要形式也是单字符getch()的形式.但是这些没有检测到按键的长度 - 它们只检测KEYDOWN.
我认识到检测按键的长度是游戏中的必要任务,所以我希望pygame有方法来检测按键持续时间.但我希望可以使用更纤薄,更直接的库来检测按键持续时间.
在python子进程模块中,如果我们想运行shell命令
foo | grep bar
Run Code Online (Sandbox Code Playgroud)
从python内部,我们可能会使用
p1 = Popen(["foo"], stdout = PIPE)
p2 = Popen(["grep", "bar"], stdin = p1.stdout, stdout = PIPE)
p1.stdout.close()
output = p2.communicate()[0]
Run Code Online (Sandbox Code Playgroud)
我对这条线感到困惑p1.stdout.close()
。如果您能原谅我,我将追踪我认为程序的工作方式,并且该错误将有望揭晓。
在我看来,当该行output = p2.communicate()[0]
由python制定时,python尝试调用p2
,它认识到需要从输出p1
。因此它调用p1
,执行foo
并把输出扔到堆栈上,以便p2
完成执行。然后p2
完成。
但是,在此跟踪中p1.stdout.close()
实际上没有任何地方发生。那么实际发生了什么?在我看来,行的排序可能也很重要,因此以下内容将不起作用:
p1 = Popen(["foo"], stdout = PIPE)
p1.stdout.close()
p2 = Popen(["grep", "bar"], stdin = p1.stdout, stdout = PIPE)
output = p2.communicate()[0]
Run Code Online (Sandbox Code Playgroud)
这就是我的理解状态。
python ×2
autocomplete ×1
c++ ×1
constructor ×1
keypress ×1
new-operator ×1
pipe ×1
subprocess ×1
vim ×1
vim-plugin ×1