小编dav*_*uda的帖子

为什么在这个链表的实现中,这个 C++ 构造函数在相同的内存位置被调用两次?

我正在阅读 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)

c++ constructor new-operator

7
推荐指数
1
解决办法
127
查看次数

如何在vim中有效撤消自动完成

现在我正在使用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说:"哦,我很抱歉!毕竟我并不是要完成任务!请假装我没有."

现在,对我来说明显的选择是:

  1. 点击TabShift+ Tab足够的时间回到我的初始.但是如果有很多相似的词,特别是不同的长度,这很烦人.
  2. 无论如何需要多次支持退格键,或者其他一些天真的删除.但这些肯定是不必要的关键.
  3. 点击Esc+ u以获得撤消,但这会撤消我的全部信息(如果我快速键入,则会更多).这是完全不可接受的.然后,我需要重新进入插入模式并重新输入.毛.
  4. 点击Ctrl+ U撤消而不离开插入模式.但这也有过多的消除方式.
  5. Ctrl+ W删除最后一个单词.虽然我在不退出插入模式的情况下执行此操作,但仍需要重新键入.这是迄今为止我发现的最好的.

如果我没有longest启用,那么我可以使用Ctrl+ E,它退出菜单而不插入任何其他内容.但是,由于最长时间打开,它会停止自动完成,但会保留输入的最长公共匹配.

当然必须有更好的方法来做到这一点.

vim autocomplete vim-plugin

6
推荐指数
1
解决办法
1101
查看次数

确定python中的按键长度

假设我想在python中创建一个非常简单的程序,指示按下一个键的时间.因此,如果我键入并按住j键片一会儿,我正在寻找一个能够显示信息的程序the key 'j' was pressed for 1.1 seconds.

根据我的理解,应该实现的方式是检测KEYDOWN事件和KEYUP事件并对其加时间戳,并对时间戳进行适当的减法.因此,检测KEYDOWN和KEYUP事件就足够了.

关于检测单个按键或检测单个字符输入的SO有各种各样的问题和答案,例如这一个这个,它们都使用某种形式的getch.我查看了python curses库,从我可以看出,密钥检测的主要形式也是单字符getch()的形式.但是这些没有检测到按键的长度 - 它们只检测KEYDOWN.

我认识到检测按键的长度是游戏中的必要任务,所以我希望pygame有方法来检测按键持续时间.但我希望可以使用更纤薄,更直接的库来检测按键持续时间.

python keypress

5
推荐指数
1
解决办法
2291
查看次数

管道传输时在python的子流程模块中使用stdout.close()

在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 subprocess pipe

4
推荐指数
1
解决办法
5459
查看次数