C++元组

请随心使用 C++ 的 `tuple`!

有群友问,为啥 Fibonacci 数列,Python 只要一条语句,即

a, b = b, a + b

而 C 语言却需要三条语句

int t = a;
a = b;
b = t + b;

为什么这么菜呢?

我说,也许 C 语言是这样,但其实 C++ 也只需要一条语句呀!

tie(a, b) = make_tuple(b, a + b);

并且,这样编译出来的结果,在 -O3 优化下,跟上面的朴素写法,是完全一样的哟,都会被优化成用寄存器交换:

mov esi, dword ptr [rbp - 12]
mov edx, dword ptr [rbp - 16]
add edx, esi
mov dword ptr [rbp - 16], esi
mov dword ptr [rbp - 12], edx

所以,请放心大胆地使用 C++ 的 tuple 吧!

完整的样例程序(采用了 scanf 动态读入,防止被优化成常数……)

#include <tuple>
#include <cstdio>

using std::tie;
using std::make_tuple;

int main() {
    scanf("%d %d", &a, &b);

    printf("%d, %d\n", a, b);

    tie(a, b) = make_tuple(b, a + b);

    printf("%d, %d\n", a, b);

    return 0;
}

Colliot8/20/2019, 8:14:02 AM


Preview:

Cancel

Elsewhere

Colliot replied to 什么是 Young Tableau?

require{mhchem} ce{Zn^2+ <=>[+ 2OH-][+ 2H+] underset{text{zinc hydroxide}}{ce{Zn(OH)2 v}} <=>[+ 2OH-][+ 2H+] nderset{text{tetrahydroxozincate(II)}}{ce{[Zn(OH)4]^2-}}}

Colliot replied to 我们也许需要从邮件提醒功能做起

I hope you are wrong, too.

Colliot replied to 虎哥牛逼,竟然解决了净土网站的bug

我已经注意到了。谢谢!

ice1000 replied to 虎哥牛逼,竟然解决了净土网站的bug

本质原因是不知道是 WebStorm 还是啥给虎哥自动 import 了一个 from 是 import { from } from 'rxjs/internal/observable/from'; 但是 rxjs 实际上打包的时候用的是 esm5 里的。

Colliot replied to 求助帖,需要网站管理员帮助

我等会儿给你处理吧。

xiang replied to 一台电脑如何利用另一台电脑上网?

优质解决方案: 买个好的台式机无线网卡

fumeboy replied to 我们也许需要从邮件提醒功能做起

补充: 册新用户的时候,设置 > 个人档 里 有黄色提醒:“没有验证邮箱”,而我的邮箱里是没有收到邮件的

nickname replied to 哪里有能知道文件格式的百科?

intro (html) reference (djvu), from http://djvu.org/resources/

glegle replied to 为什么 Golang 和 Rust 写的东西不支持 ProxyChains?

https://github.com/rofl0r/proxychains-ng/issues/199 这里有相关的讨论,graftcp 对此做了改进,无论动态链接还是静态链接都能支持。

glegle replied to 为什么 Golang 和 Rust 写的东西不支持 ProxyChains?

proxychains 是支持 rust 编译的程序的,不支持 Golang 编译出来的东西。原理就是 proxychains 是通过劫持动态库的 connect() 等一系列 libc 函数达到重定向的目的,而 golang 是静态编译,所以无法支持。