作者poyenc (发箍)
看板C_and_CPP
标题Re: [问题] tuple如何用for回圈取值
时间Thu Jul 2 04:47:11 2020
※ 引述《nevak (^o^)》之铭言:
: 虽然原文有点长不过听起来应该就是做参数的Cartesian product
: Python有人说过了秒解XD,C++当作练习其实也满不错的
: 这应该面试也常常会考吧XD
: Cartesian product最直觉就DFS走一次
: 实作上来说,看你最後是要给system()用,其实直接把参数做成string应该会单纯很多
: 如果你一开始的那些参数的列表一定要用不同型态的vector的话
: 就会有点麻烦需要用template https://glot.io/snippets/fou4l2ksnm
: 如果你那些参数列表都用vector<string>来宣告的话
: 就把所有参数订在vector<vector<string>>,练习写个DFS吧
: 应该是不会需要用到tuple
为了怕初学者误解这里的程式码, 还是单独回一篇.
因为许多人学习 C++ 的管道并不是书籍, 而是网路上的文章, 再加上从
程式码范例望文生义, 最终理解就会和语言设计不同.
首先来谈谈
auto 修饰符的用法.
auto 依赖使用者完全知道给定的叙述
型别为何, 不然不仅无法写出
型别安全 (type safe) 的程式, 反而还造
成潜在问题
(auto 是为了型别安全而设计, 虽然也带来便利性, 但後者
不是主要目的). 如下面的例子:
std::array values{
1,
2,
3};
for (
auto idx =
0; idx < size(values); ++idx) {
~~~~^~~~~~~~~~~~~~ error
std::cout <<
"values[" << idx
<<
"] = " << values[idx] << std::endl;
}
为了解决这个问题 C++23 导入了 uz/z 整数後缀
[P0330], 只是标准库
先迎来了 ssize() 函式
[P1227].
auto 在源头尽可能地省下转型成本,
却导致了我们在後续使用上需小心别掉入自己的假设陷阱.
再来是 initializer list
(语法) 的使用, 除了可拿来初始化阵列以及
结构物件, 加强版功能率先在
[N1509] 被提出来, 主要为支援以下两种
情境:
1. initializer list 拿来当叙述使用
(间接功能)
2. initializer list 拿来初始化容器
(主要功能)
在 C++11 以前, 初始化物件非常麻烦, 遂出现许多冗余的写法:
// case #1
struct S {
int a, b; };
void f(S);
S s;
s.a =
1;
s.b =
2;
f(s);
// method #1, error prone
f({
1,
2});
// method #2, need C++11 support
// case #2
int a[] = {
0,
1,
2};
std::vector<
int> v(a, a +
3);
// method #1, error prone
std::vector<
int> v2 = {
0,
1,
2};
// method #2, need C++11 support
最开始还只是语言支援, 後来才导入 std::initializer_list 代理物件
的概念
[N2215] 来
帮助编译器在遇到使用 initializer list 初始化物
件时, 选用合适的建构子呼叫. 在这之後几乎所有容器都加入了接受
std::initializer_list 的多载建构子版本
[N2679].
所以严格说起来用
auto 来接 std::initializer_list 物件并不是後者
的设计本意, 它本身
不算是容器, 而是作为容器的初始化介面型别 (所
以不存在 assign()/erase() 等成员函式). 虽然这份程式码还是编译得
过, 但在 C++ 社群里几乎不会有这种非正规用法.
References
[P0330R8] Literal Suffixes for (signed) size_t
https://wg21.link/p0330r8
[P1227R2] Signed ssize() functions, unsigned size() functions
https://wg21.link/p1227r2
[N1509] Generalized Initializer Lists
https://wg21.link/n1509
[N2215] Initializer lists (Rev. 3)
https://wg21.link/n2215
[N2679] Initializer Lists for Standard Containers (Revision 1)
https://wg21.link/n2679
--
[P1389R1] Standing Document for SG20: Guidelines for
Teaching C++ to Beginners
https://wg21.link/p1389r1
SG20 Education and Recommended Videos for Teaching C++
https://www.cjdb.com.au/sg20-and-videos
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.76.216 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1593636441.A.1C2.html
※ 编辑: poyenc (123.193.76.216 台湾), 07/02/2020 05:25:26
1F:→ nevak: 感谢说明,auto = {}确实是当时我偷懒的写法,希望大家别 07/02 09:53
2F:→ nevak: 在正式的code这样写。 07/02 09:53
3F:推 Dracarys: 哇 大神不睡觉的? 07/02 12:21
4F:推 Jockey66666: 已跪 07/02 23:58
5F:推 lc85301: c++23 .... 07/03 08:02
6F:推 KevinR: 推 07/05 08:17