与经典问题相关的是找到一个不在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_MIN和INT_MAX.
考虑向下转换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?
当移动-构造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. …
在诺曼·马特洛夫(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中是否有函数?
感谢您的澄清。
据说在 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 ++代码
#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是一个明确的整数值,而local和gm则struct 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 …
尝试了解在类 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):
问题:
供您参考,我已在 Mac OS Mojave 终端和 Ubuntu 18.04 终端上测试了此行为。我已经使用等效的 Python 3 脚本进行了测试。结果是一致的。我也尝试过fflush(stdout)在 C/C++ 中使用,但没有成功。
PS 这个问题源于要在 Mac 或 Linux 上运行的 C++ 程序。我认为这与语言本身无关,所以我将其简化为 bash 脚本。如果可能,请建议一个可以用 C/C++ 完成的解决方案。
我碰巧发现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编译,而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是一个编译器扩展,但哪个应该是正确的?
我想将一个临时容器转换为一个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) 以下 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)
但我不了解有关唯一指针的行上的语法。
问题:
的语法是<class A_impl>什么?这叫什么(放在class未声明的标识符之前)?它是在做“前向声明”A_impl还是什么?我没有说任何关于 identifier 的内容A_impl。为什么编译器可以接受?
如果这碰巧可能与任何“设计模式”有关,请帮助我识别它。
请指出正确的方向。
由于没有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)