小编Kon*_*lph的帖子

"aaaa".StartsWith("aaa")返回false

如果这不是一个错误,那么有人可以解释这种行为背后的原因吗?事实上,似乎每个奇数个字母都会返回false:

string test = "aaaaaaaaaaaaaaaaaaaa";
Console.WriteLine(test.StartsWith("aa"));
Console.WriteLine(test.StartsWith("aaa"));
Console.WriteLine(test.StartsWith("aaaa"));
Console.WriteLine(test.StartsWith("aaaaa"));
Console.WriteLine(test.StartsWith("aaaaaa"));
Console.WriteLine(test.StartsWith("aaaaaaa"));
Run Code Online (Sandbox Code Playgroud)

在丹麦系统上执行时输出后的输出:

True
False
True
False
True
False
Run Code Online (Sandbox Code Playgroud)

c# string startswith

17
推荐指数
1
解决办法
1608
查看次数

为什么告知"中止"是违法的?

函数GNU libc文档abort包含以下通知:

未来变更警告:建议的联邦审查规定可能禁止我们向您提供有关调用此功能的可能性的信息.我们需要说这不是终止程序的可接受方式.

呃,什么?

我找到了一个七岁的Reddit讨论这个问题.看来该通知是由Richard Stallman在1995年提出的 - 所以它已经存在了一段时间.然而,除了1999年的邮件列表线程声称这是一个笑话,我找不到任何进一步的信息.

那么:这只是一个由rms投入的复活节彩蛋吗?或者它是否严重(虽然可能不再相关)?如果是这样,它指的是什么?

相同功能的Open Group POSIX文档不包含任何类似的内容,也没有我查阅的任何手册页.

c gnu libc code-documentation

17
推荐指数
1
解决办法
1354
查看次数

公共构造函数和静态构造函数

我正在阅读使用两个构造函数的C#代码.一个是静态的,另一个是公开的.这两个构造函数有什么区别?为了我们必须使用静态构造函数?

c# static-constructor

16
推荐指数
2
解决办法
9072
查看次数

在VB中使用字符串中的左双引号

在下面的代码中,字符串的使用"“"(即字符串中的左双引号)导致VB.NET中的编译错误:

StringVar = Replace(StringVar, "“", "“")
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

vb.net string escaping character-encoding quotation-marks

16
推荐指数
1
解决办法
9995
查看次数

strstr比算法快?

我有一个21056字节的文件.

我在C中编写了一个程序,将整个文件读入缓冲区,然后使用多个搜索算法在文件中搜索82个字符的标记.

我已经使用了"精确字符串匹配算法"页面中所有算法的实现.我用过:KMP,BM,TBM和Horspool.然后我使用strstr并对每一个进行基准测试.

我想知道的是,每次strstr优于所有其他算法.有时候唯一更快的是BM.

strstr应该是最慢的?

这是我的基准代码,其中包含基准测试BM的示例:

double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}
Run Code Online (Sandbox Code Playgroud)
before = get_time();
BM(token, strlen(token), buffer, len);
after = get_time();
printf("Time: %f\n\n", after - before);
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么strstr表现优于其他搜索算法吗?如果需要,我会根据请求发布更多代码.

c algorithm performance string-matching strstr

16
推荐指数
2
解决办法
1万
查看次数

将临时绑定到非const引用

合理

我会尽量避免在C++代码分配完全.也就是说,我只使用初始化并const尽可能地声明局部变量(即总是除了循环变量或累加器之外).

现在,我发现了一个不起作用的情况.我认为这是一般模式,但特别是在以下情况下出现:

问题描述

假设我有一个程序将输入文件的内容加载到字符串中.您可以通过提供文件名(tool filename)或使用标准输入流(cat filename | tool)来调用该工具.现在,我如何初始化字符串?

以下不起作用:

bool const use_stdin = argc == 1;
std::string const input = slurp(use_stdin ? static_cast<std::istream&>(std::cin)
                                          : std::ifstream(argv[1]));
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?因为原型slurp需要看起来如下:

std::string slurp(std::istream&);
Run Code Online (Sandbox Code Playgroud)

也就是说,我的论证是非 - const因此我不能将它绑定到临时的.似乎没有办法使用单独的变量.

丑陋的解决方法

目前,我使用以下解决方案:

std::string input;
if (use_stdin)
    input = slurp(std::cin);
else {
    std::ifstream in(argv[1]);
    input = slurp(in);
}
Run Code Online (Sandbox Code Playgroud)

但这是以错误的方式揉搓我.首先,它是更多的代码(在SLOC中),但它也使用一个if而不是(这里)更逻辑的条件表达式,并且它在声明后使用我想要避免的赋值.

是否有一种避免这种间接初始化方式的好方法?这个问题可能会推广到需要改变临时对象的所有情况.难道流不是设计得不好以应对这种情况(const流没有意义,但是在临时流上工作确实有意义)?

c++ const temporary

16
推荐指数
2
解决办法
1393
查看次数

如何出口适当的TSV?

简短而甜蜜:如何从R导出TSV/CSV?

write.table/ write.csv 几乎有效:

test <- data.frame(a = 2 : 4, b = 3 : 5)
write.table(test, file='test.tsv', quote=FALSE, sep='\t')
Run Code Online (Sandbox Code Playgroud)
$ more test.tsv
a   b
1   2   3
2   3   4
3   4   5
Run Code Online (Sandbox Code Playgroud)

...但产生的格式与大多数其他程序的格式不同:

    a   b
1   2   3
2   3   4
3   4   5
Run Code Online (Sandbox Code Playgroud)

- 注意标题行的不同处理方式.

如何导出第二种格式而不是第一种格式?手动指定col.namesas c('', colnames(test))不起作用 - R抱怨无效的参数.

r tsv

16
推荐指数
1
解决办法
2万
查看次数

非依赖名称查找和lambda

我有以下代码:

template <class T>
class Outer
{
public:
    Outer();

    template <class U>
    void templateFunc()
    {
    }

private:
    class Inner
    {
    public:
        Inner(Outer& outer)
        {
            outer.templateFunc<int>();
            Outer* outer_ptr = &outer;
            [outer_ptr]() 
            {
                outer_ptr->templateFunc<int>();
            }();
        }
    };

    Inner m_inner;
};

template <class T>
Outer<T>::Outer()
    : m_inner(*this)
{
}

int main()
{
    Outer<double> outer;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个模板类包含一个嵌套类,它在构造函数中调用其封闭类的一些模板方法.AFAIK,即使封闭类是一个模板类 - 对于嵌套类,它是一个非依赖名称,因此调用其模板方法不template应该是一个问题.当我在嵌套类的构造函数中定义lambda,捕获指向外部类的指针,并尝试调用相同的模板方法时,问题就出现了 - g ++ 7.2给出了以下编译错误:

prog.cc: In lambda function:

prog.cc:22:41: error: expected primary-expression before 'int'
                outer_ptr->templateFunc<int>();
                                        ^~~
prog.cc:22:41: error: expected ';' before 'int'
Run Code Online (Sandbox Code Playgroud)

但是,g …

c++ lambda templates language-lawyer c++11

16
推荐指数
1
解决办法
331
查看次数

R 3.6.1的随机数生成器

我使用的是R(3.6.1)的最新版本,但是当我使用使用随机数生成器的函数时,它们默认使用的是较旧的(即3.6.0之前的版本)RNG,该RNG使用舍入而不是拒绝进行采样。我不确定为什么会这样,感谢您的解决。

set.seed(1)
sample(20)
RNGkind()
R.version
Run Code Online (Sandbox Code Playgroud)

以下是我的跑步结果:

set.seed(1)
sample(20)
# 6  8 11 16  4 14 15  9 19  1  3  2 20 10  5  7 12 17 18 13

RNGkind()
# "Mersenne-Twister" "Inversion"        "Rounding"

R.version

platform       x86_64-w64-mingw32                         
arch           x86_64                                     
os             mingw32                                    
system         x86_64, mingw32                            
status         Patched                                    
major          3                                          
minor          6.1                                        
year           2019                                       
month          09                                         
day            06                                         
svn rev        77160                                      
language       R                                          
version.string R version 3.6.1 Patched (2019-09-06 r77160)
nickname       Action of the Toes        
Run Code Online (Sandbox Code Playgroud)

基于新闻链接的讨论,我期望的输出RNGkind()看起来如下: …

r

16
推荐指数
1
解决办法
497
查看次数

当 operator delete() 被删除时,operator new() 的行为取决于默认构造函数的存在

使用运算符 new() 创建类 C 的新对象会在此处出现错误:

class C
{
public:
    C() {}
    virtual ~C() {}

    void operator delete(void*) = delete;
};


int main()
{
    C* c = new C;
}
Run Code Online (Sandbox Code Playgroud)

C2280: 'void C::operator delete(void *)': function was explicitly deleted

但是,当我更换C() {} 使用C() = default; 或删除线,使编译器插入一个默认的构造函数(我相信有同样的效果= default),该代码将编译并运行。

使这种情况发生的编译器生成的默认构造函数和用户定义的默认构造函数之间有什么区别?

我在这篇文章中得到了一些提示,但是这里的 C 类(没有用户提供的构造函数)并不是微不足道的,因为析构函数是虚拟的,对吧?

使用最新的 Visual Studio,c++17 编译。

c++ default-constructor delete-operator

16
推荐指数
1
解决办法
341
查看次数