我发现使用git子模块时,我经常遇到在包含给定子模块的提交和代表与普通目录相同的代码的提交之间合并的问题.小型复制示例:
# Create one project, to be used as a subproject later on
git init a
cd a
echo aaa > aa
git add -A
git commit -m a1
cd ..
# Create a second project, containing a as a normal directory initially
git init b
cd b
mkdir a b
echo aaa > a/aa
echo bbb > b/bb
git add -A
git commit -m b1
# Replace directory with submodule
git rm -r a
git submodule add ../a a …
Run Code Online (Sandbox Code Playgroud) 我正在学习"类和接口的初始化",它说"T是一个顶级类,并且在T中执行词法嵌套的断言语句." 任何人都可以告诉我"T是一个顶级类,并且执行一个词法嵌套在T中的断言语句." 举个例子?
这句话来自JLS,原文是这样的:
类或接口类型T将在第一次出现以下任何一个之前立即初始化:
- T是一个类,并且创建了T的实例.
- T是一个类,并且调用由T声明的静态方法.
- 分配由T声明的静态字段.
- 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).
- T是顶级类,并且执行在词典内嵌套在T中的断言语句(第14.10节).
假设我有一个包含一些数据的大量字节(最多4GB).这些字节对应于这样的方式,每一个不同的对象小号字节(认为小号最多32个)将构成一个对象.一个重要的事实是,对于所有对象,此大小s是相同的,不存储在对象本身内,并且在编译时不知道.
目前,这些对象只是逻辑实体,而不是编程语言中的对象.我对这些对象进行了比较,其中包括对大多数对象数据的字典对比,以及使用剩余数据打破关系的一些不同功能.现在我想将这些对象进行排序效率(这是真的要成为应用的瓶颈).
我想到了几种可能的方法来实现这一目标,但是每一种方法似乎都有一些相当不幸的后果.您不一定非必须阅读所有这些内容.我试图用粗体打印每种方法的核心问题. 如果您打算提出其中一种方法,那么您的答案也应该回答相关问题.
当然,C快速排序算法也可用于C++应用程序.它的标志几乎完美符合我的要求.但是使用该函数将禁止内联比较函数的事实将意味着每个比较都带有函数调用开销.我曾希望有办法避免这种情况.任何关于C qsort_r
在性能方面与STL相比的经验都是非常受欢迎的.
编写一堆包含指向各自数据的指针的对象会很容易.那么人们就可以对它们进 这里有两个方面需要考虑.一方面,仅仅移动指针而不是所有数据意味着更少的内存操作.另一方面,不移动对象可能会破坏内存局部性,从而破坏缓存性能.有可能实际上从一些缓存页面访问所有数据的更快的快速排序递归水平几乎完全消失.相反,每个缓存的内存页面在被替换之前只会产生非常少的可用数据项.如果有人能提供一些关于复制和记忆位置之间权衡的经验,我会很高兴.
我写了一个类作为内存范围的迭代器.取消引用此迭代器不会产生引用,而是产生一个新构造的对象来保存指向数据的指针和在构造迭代器时给出的大小s.所以可以比较这些对象,我甚至可以实现std::swap
这些目标.不幸的是,它似乎std::swap
还不够std::sort
.在该过程的某些部分,我的gcc实现使用插入排序(__insertion_sort
在文件中实现stl_alog.h
),它将值移出序列,将数字项移动一步,然后将第一个值移回适当的序列中位置:
typename iterator_traits<_RandomAccessIterator>::value_type
__val = _GLIBCXX_MOVE(*__i);
_GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
*__first = _GLIBCXX_MOVE(__val);
Run Code Online (Sandbox Code Playgroud)
您是否知道标准排序实现不需要值类型但可以单独使用交换操作?
所以我不仅需要我的类作为参考,但我还需要一个类来保存临时值.由于我的对象的大小是动态的,我必须在堆上分配它,这意味着在recusrion树的叶子上分配内存.也许一种替代方案是具有静态大小的vaue类型,该大小应足够大以容纳我当前打算支持的大小的对象.但是,这将意味着将在之间的关系更加两轮牛车reference_type
和value_type
迭代器类.这意味着我必须为我的应用程序更新该大小,以便有一天支持更大的对象.丑陋.
如果你能想出一个干净的方法来让上面的代码操作我的数据而不必动态分配内存,那将是一个很好的解决方案.我已经在使用C++ 11功能了,所以使用移动语义或类似功能不会有问题.
我甚至考虑重新实现所有的快速排序.也许我可以利用这样一个事实,即我的比较主要是字典比较,即我可以按第一个字节对序列进行排序,只有当所有元素的firt字节相同时才切换到下一个字节.我还没有弄清楚这方面的细节,但是如果有人可以建议一个引用,一个实现,甚至一个规范的名称作为这样一个按字节顺序排列的词典排序的关键字,我会非常高兴.我仍然不相信通过合理的努力,我可以击败STL模板实现的性能.
我知道那里有很多种排序算法.其中一些可能更适合我的问题.我首先想到了基数排序,但我还没有想到这一点.如果您可以建议更适合我的问题的排序算法,请执行此操作.优选实施,但即使没有.
所以基本上我的问题是:
"你如何有效地在堆内存中对动态大小的对象进行排序?"
任何适用于我的情况的问题的答案都是好的,无论它是否与我自己的想法有关.以粗体标记的个别问题的答案,或任何其他可能帮助我在我的选择之间做出决定的见解也是有用的,特别是如果没有对单一方法的明确答案出现.
假设我有这张桌子tab
(小提琴可用).
| g | a | b | v |
---------------------
| 1 | 3 | 5 | foo |
| 1 | 4 | 7 | bar |
| 1 | 2 | 9 | baz |
| 2 | 1 | 1 | dog |
| 2 | 5 | 2 | cat |
| 2 | 5 | 3 | horse |
| 2 | 3 | 8 | pig |
Run Code Online (Sandbox Code Playgroud)
我正在按行分组 …
我想问一下R中特定编码问题的效率建议.我有一个以下样式的字符串向量:
[1] "HGVSc=ENST00000495576.1:n.820-1G>A;INTRON=1/1;CANONICAL=YES"
[2] "DISTANCE=2179"
[3] "HGVSc=ENST00000466430.1:n.911C>T;EXON=4/4;CANONICAL=YES"
[4] "DISTANCE=27;CANONICAL=YES;common"
Run Code Online (Sandbox Code Playgroud)
在向量的每个元素中,单个条目用a ;
和MOST 分隔,单个条目具有格式KEY=VALUE
.但是,也有一些条目只有格式KEY
(参见[4]中的"common").在此示例中,有15个不同的键,并不是每个键都出现在向量的每个元素中.15个不同的键是:
names <- c('ENSP','HGVS','DOMAINS','EXON','INTRON', 'HGVSp', 'HGVSc','CANONICAL','GMAF','DISTANCE', 'HGNC', 'CCDS', 'SIFT', 'PolyPhen', 'common')
Run Code Online (Sandbox Code Playgroud)
从这个向量我想创建一个如下所示的数据帧:
ENSP HGVS DOMAINS EXON INTRON HGVSp HGVSc CANONICAL
1 - - - - 1/1 - ENST00000495576.1:n.820-1G>A YES
2 - - - - - - - -
3 - - - 4/4 - - ENST00000466430.1:n.911C>T YES
4 - - - - - - - YES
GMAF DISTANCE HGNC CCDS SIFT PolyPhen common
1 …
Run Code Online (Sandbox Code Playgroud) 我有一个ANTLR 4语法,并从中构建了一个词法分析器和解析器.现在我试图以这样的方式实例化该解析器,它将解析直到遇到错误.如果遇到错误,则不应继续解析,但应提供有关问题的有用信息; 理想情况下是机器可读的位置和人类可读的消息.
这就是我现在所拥有的:
grammar Toy;
@parser::members {
public static void main(String[] args) {
for (String arg: args)
System.out.println(arg + " => " + parse(arg));
}
public static String parse(String code) {
ErrorListener errorListener = new ErrorListener();
CharStream cstream = new ANTLRInputStream(code);
ToyLexer lexer = new ToyLexer(cstream);
lexer.removeErrorListeners();
lexer.addErrorListener(errorListener);
TokenStream tstream = new CommonTokenStream(lexer);
ToyParser parser = new ToyParser(tstream);
parser.removeErrorListeners();
parser.addErrorListener(errorListener);
parser.setErrorHandler(new BailErrorStrategy());
try {
String res = parser.top().str;
if (errorListener.message != null)
return "Parsed, but " + errorListener.toString();
return …
Run Code Online (Sandbox Code Playgroud) 我已经读过如何添加
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
Run Code Online (Sandbox Code Playgroud)
在您的HTML中,用户可以将该页面添加到主屏幕并将其用作应用程序.所以我想知道将这些元标记添加到我生成的几乎所有HTML中是否有意义.毕竟,用户不会有他们安装的应用程序为,但如果他们选择这样做,我为什么要阻止?
我主要考虑的是未经身份验证的内容,从HTML服务器的角度来看这是静态的,尽管由于客户端JavaScript可能会产生干扰.为了给你一个想法,请考虑单页教程,也许还有一些交互式代码演示.这样的事情.
我正在使用rst2html
doctils附带的工具从reST创建HTML .似乎代码已经将id
属性分配给各个部分,这些部分可以用作URL中的片段标识符,即作为跳转到页面的特定部分的锚点.这些id
值基于部分标题的文本.当我更改标题的措辞时,标识符也会更改,从而使旧URL无效.
有没有办法指定要用作给定部分的标识符的名称,以便我可以编辑标题而不会使链接无效?如果我从我自己的脚本中自己调用docutils发布者,会有办法吗?
是否可以为constexpr变量分配唯一的地址,即对于变量可用的所有翻译单元(通常通过标题)都是相同的?请考虑以下示例:
// foo.hh
#include <iostream>
constexpr int foo = 42;
// a.cc
#include "foo.hh"
void a(void) { std::cout << "a: " << &foo << std::endl; }
// b.cc
#include "foo.hh"
extern void a(void);
int main(int argc, char** argv) {
a();
std::cout << "b: " << &foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.7 编译a.cc
和b.cc
分开并将它们链接在一起,我看到打印了两个不同的地址.如果我extern
在标题中添加关键字,我会收到链接器错误duplicate symbol _foo in: a.o and b.o
,我觉得有点令人惊讶,因为我认为添加extern
更有可能导致编译器从另一个对象导入该符号,而不是从当前对象导出它.但似乎我对这些事情的运作方式的理解是错误的.
是否有合理的方法在一个标题中声明constexpr,这样所有翻译单元都可以在其常量表达式中使用它,并且所有翻译单元都同意该符号的地址?我希望一些额外的代码来表示这个符号实际所属的单个翻译单元,就像没有的extern
非extern
变量一样constexpr
.
假设我有一些asm.js代码,可能是由emscripten创建的.假设它有一些相当大的堆分配结构,它由asm.js函数返回,作为一个指针,由一些JavaScript库拾取,包装在一个漂亮的JavaScript对象中.好到目前为止.
但是,如果该对象超出范围并被垃圾收集,会发生什么.现在,asm.js代码无法知道这一点,因此结构的内存将保持分配状态,从而导致内存泄漏.
有没有办法从JavaScript中向JavaScript对象添加终结器?
这样的终结器可用于释放asm.js中的内存,从而避免内存泄漏.到目前为止,我找不到一个记录在案的便携式方法来实现这一点,但也许我一直在寻找错误的地方.