小编aaf*_*lei的帖子

有效地找到不在大小为40,400或4000的整数中的整数

与经典问题相关的是找到一个不在40亿个给定值中但不完全相同的整数.

为了澄清,通过整数我真正的意思只是其数学定义的一个子集.也就是说,假设只有有限数量的整数.用C++说,它们int在范围内[INT_MIN, INT_MAX].

现在给出一个std::vector<int>(没有重复)或者std::unordered_set<int>其大小可以是40,400,4000左右,但不是太大,如何有效地生成一个保证不属于给定数字的数字?

如果不担心溢出,那么我可以将所有非零的相加,并将产品加1.但是有.对手测试用例可以包含INT_MAX.

我更赞成简单,非随机的方法.有没有?

谢谢!

更新:为了消除歧义,让我们说一个未分类的std::vector<int>,保证没有重复.所以我问是否有比O(n log(n))更好的东西.另请注意,测试用例可能包含INT_MININT_MAX.

c++ algorithm

29
推荐指数
3
解决办法
2617
查看次数

为什么在将 C 向下转换从 unsigned int 转换为 unsigned char 时,movl 比 movb 更受欢迎?

考虑向下转换unsigned为的精简示例unsigned char

void unsigned_to_unsigned_char(unsigned *sp, unsigned char *dp)
{
  *dp = (unsigned char)*sp;
}
Run Code Online (Sandbox Code Playgroud)

上面的 C 代码被翻译成汇编代码,gcc -Og -S如下所示

movl    (%rdi), %eax
movb    %al, (%rsi)
Run Code Online (Sandbox Code Playgroud)

出于什么原因,C 到汇编的翻译不是如下所示?

movb    (%rdi), %al
movb    %al, (%rsi)
Run Code Online (Sandbox Code Playgroud)

是因为这是不正确的,还是因为比movl它更传统或更短的编码movb

c x86 assembly gcc micro-optimization

15
推荐指数
2
解决办法
634
查看次数

从具有按值捕获的 lambda 移动构造 std::function 时调用两次移动构造函数

当移动-构造std::function从一个对象的λ,其中该拉姆达具有由值捕获,看来该物体的移动,构造函数,是值捕获被调用两次。考虑

#include <功能>
#include <iostream>

结构体
{
    整数值 = 1;

    Foo() = 默认值;

    Foo(const Foo &) {}

    富(富&&)
    {
        std::cout << "移动构造函数" << std::endl;
    }
};

int main()
{
    福福;
    自动 lambda = [=]() { 返回 foo.value; };
    std::cout << "---------" << std::endl;
    std::function<int()> func(std::move(lambda));
    std::cout << "---------" << std::endl;
    返回0;
}

输出是

---------
move ctor
move ctor
---------
Run Code Online (Sandbox Code Playgroud)

我在 Mac OS X Catalina 上工作,我的编译器是

g++-9 (Homebrew GCC 9.3.0) 9.3.0
Run Code Online (Sandbox Code Playgroud)

我用g++ -std=c++17. …

c++ lambda move-semantics std-function c++17

14
推荐指数
1
解决办法
663
查看次数

R中的功能是“ for”吗?

在诺曼·马特洛夫(Norman Matloff)的《 R编程的艺术》的 307 页中,作者说

for() 实际上是一个功能。

上下文是对一段代码片段的说明

for (i in 1:length(x)) z[i] <- x[i] + y[i]
Run Code Online (Sandbox Code Playgroud)

作者评论

尽管从语法上看,循环看起来是无害的,但for()实际上是一个函数。

我的理解是他在说的for()是一个函数,就像+一个函数(可调用对象)一样。假设我们可以+通过标准的函数调用方式进行调用,例如

"+"(3 ,5)  # 8
Run Code Online (Sandbox Code Playgroud)

我有C / C ++和Python的背景知识,并且注意到两种语言之间的细微差别。例如,

  • return是R中的一个函数,而不是一个语句,因此我们必须return(1)在括号中编写。

回到我的问题:forR中是否有函数?

感谢您的澄清。

r

9
推荐指数
1
解决办法
104
查看次数

指向数组第一个元素之前的指针

据说在 C 中,当指针指向同一个数组或该数组末尾之后的一个元素时,算术和比较是明确定义的。那么数组第一个元素之前的一个呢?只要我不取消引用就可以了吗?

给定的

int a[10], *p;
p = a;
Run Code Online (Sandbox Code Playgroud)

(1) 写字合法--p吗?

(2)p-1在表达式中写入是否合法?

(3) 如果 (2) 没问题,我可以断言p-1 < a吗?

对此有一些实际的担忧。考虑一个reverse()函数,它反转以 结尾的 C 字符串'\0'

#include <stdio.h>

void reverse(char *p)
{
    char *b, t;

    b = p;
    while (*p != '\0')
        p++;
    if (p == b)      /* Do I really need */
        return;      /* these two lines? */
    for (p--; b < p; b++, p--)
        t = *b, *b = *p, *p …
Run Code Online (Sandbox Code Playgroud)

c pointer-arithmetic language-lawyer

9
推荐指数
1
解决办法
262
查看次数

struct tm是否将时区信息存储为其数据成员

考虑以下C ++代码

#include <ctime>
#include <iostream>

int main()
{
    std::time_t now = std::time(nullptr);
    struct tm local = *std::localtime(&now);
    struct tm gm = *std::gmtime(&now);
    char str[20];
    std::strftime(str, 20, "%Z", &local);
    std::cout << str << std::endl;          // HKT
    std::strftime(str, 20, "%Z", &gm);
    std::cout << str << std::endl;          // UTC

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,其中存储的now是一个明确的整数值,而localgmstruct tm存储了人类可读的日期/时间信息。然后,仅基于struct tm对象打印出格式化的信息(时区)。

根据CPLUSPLUS 参考,的数据成员struct tm

tm_sec  
tm_min  
tm_hour 
tm_mday 
tm_mon  
tm_year 
tm_wday 
tm_yday 
tm_isdst
Run Code Online (Sandbox Code Playgroud)

如果仅此struct …

c c++ ctime time.h

8
推荐指数
1
解决办法
97
查看次数

终端背景颜色并不总是使用“\033[0m”正确重置

尝试了解在类 Unix 操作系统(Mac、Linux)上重置背景颜色时的终端行为。

考虑一个 bash 脚本

#!/usr/bin/env bash

printf "\033[46m"
printf "On Cyan\n"
printf "\033[0m"
printf "Back to Normal\n"
Run Code Online (Sandbox Code Playgroud)

当我最初运行这个脚本时,一切都按预期进行。但是,如果重复几次,打印结果就会改变。以下"Back to Normal"是青色背景色上的一条线。

屏幕截图(终端,Mac OS Mojave):

在此输入图像描述

问题:

  1. 为什么是这样?谁能解释这种行为?
  2. 如果我更改了背景颜色并打印了一行(以换行符结尾),我该如何正确重置背景并避免这种不需​​要的尾随背景颜色?

供您参考,我已在 Mac OS Mojave 终端和 Ubuntu 18.04 终端上测试了此行为。我已经使用等效的 Python 3 脚本进行了测试。结果是一致的。我也尝试过fflush(stdout)在 C/C++ 中使用,但没有成功。

PS 这个问题源于要在 Mac 或 Linux 上运行的 C++ 程序。我认为这与语言本身无关,所以我将其简化为 bash 脚本。如果可能,请建议一个可以用 C/C++ 完成的解决方案。

c unix macos bash terminal

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

GCC 和 Clang 在与 __builtin_constant_p 相关的 static_assert 方面有所不同

我碰巧发现GCC和Clang在以下代码的编译上有所不同:

struct Foo
{
    int mem = 42;
};

int main()
{
    constexpr Foo foo;
    static_assert(__builtin_constant_p(foo));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用g++ -std=c++17和编译clang++ -std=c++17

特别是,

  • 加++ g++-9 (Homebrew GCC 9.3.0_1) 9.3.0编译,而
  • clang++Apple clang version 11.0.3 (clang-1103.0.32.62)无法编译,抱怨说
error: static_assert failed due to requirement '__builtin_constant_p(foo)'
    static_assert(__builtin_constant_p(foo));
    ^             ~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我没有发现任何关于__builtin_constant_p.

为了 __builtin_constant_p

海湾合作委员会

您可以使用内置函数 __builtin_constant_p 来确定某个值在编译时是否已知为常量...

叮当

Clang 支持许多与 GCC 语法相同的内置库函数,包括 __builtin_nan、__builtin_constant_p、__builtin_choose_expr、__builtin_types_compatible_p、__builtin_assume_aligned、__sync_fetch_and_add 等。

问题:虽然我知道__builtin_constant_p是一个编译器扩展,但哪个应该是正确的?

c++ g++ static-assert constexpr clang++

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

从另一个容器移动contruct`std :: map`

我想将一个临时容器转换为一个std::map<S, T>.

假设临时容器是一个std::unordered_map<S, T>T移动构造的容器.

我的问题是:(怎么样)我可以使用移动构造函数std::map<S, T>吗?

对于简化的案例,请考虑

#include <bits/stdc++.h>
using namespace std;

template<typename S, typename T>
map<S, T>
convert(unordered_map<S, T> u)
{
    // Question: (how) can I use move constructor here?
    map<S, T> m(u.begin(), u.end());
    return m;
}

int main()
{
    unordered_map<int, int> u;

    u[5] = 6;
    u[3] = 4;
    u[7] = 8;

    map<int, int> m = convert(u);

    for (auto kv : m)
        cout << kv.first << " : " << kv.second …
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics

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

使用 `class` 关键字后跟未声明的标识符

以下 hpp 和 cpp 文件摘自我正在使用的一个大型程序。它将与g++ -std=c++17 -pedantic -Wall -Wextra.

// a.hpp

#include <memory>

class A
{
    std::unique_ptr<class A_impl> my;
};
Run Code Online (Sandbox Code Playgroud)
//a.cpp

#include "a.hpp"

int main()
{}
Run Code Online (Sandbox Code Playgroud)

但我不了解有关唯一指针的行上的语法。

问题:

  1. 的语法是<class A_impl>什么?这叫什么(放在class未声明的标识符之前)?它是在做“前向声明”A_impl还是什么?我没有说任何关于 identifier 的内容A_impl。为什么编译器可以接受?

  2. 如果这碰巧可能与任何“设计模式”有关,请帮助我识别它。

请指出正确的方向。

c++ templates

3
推荐指数
1
解决办法
115
查看次数

为什么 [ "$(ls *.jpg | wc -l)" = 0 ] 总是假的,除非去掉引号?

由于没有jpg在我的当前工作目录下的文件,为什么两个脚本jpg1.sh,并jpg2.sh给出不同的结果?如何理解差异?请注意,脚本之间的唯一区别是是否在$()命令替换周围使用双引号。

$ cat jpg1.sh
#!/bin/bash
if [ "$(ls *.jpg | wc -l)" = 0 ]; then
    echo "yes"
else
    echo "no"
fi

$ ./jpg1.sh
ls: *.jpg: No such file or directory
no

$ cat jpg2.sh
#!/bin/bash
if [ $(ls *.jpg | wc -l) = 0 ]; then
    echo "yes"
else
    echo "no"
fi

$ ./jpg2.sh
ls: *.jpg: No such file or directory
yes
Run Code Online (Sandbox Code Playgroud)

跟进

我证明打勾的答案是关键——wc -l在其返回值中有一些额外的空格。添加set -x到两个脚本后,差异就会显现出来。

$ …
Run Code Online (Sandbox Code Playgroud)

bash shell

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