auto类型说明符
auto让编译器通过初始值推算变量的类型。显然,auto定义的变量必须有初始值。
使用auto也能够在一条语句中声明多个变量。需注意,一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型必须一样。
12auto i = 0, *p = &i; // 正确,i是整数,p是整型指针auto sz = 0, pi = 3.14; // 错误,sz和pi类型不一致
编译器以引用对象的类型作为auto的类型。
12int i = 0, &r = i;auto a = r; // a是一个整数(r是i的别名,而i是一个整数)
auto一般会忽略掉顶层const,同时底层const会保留下来,比如当初始值是一个指向常量的指针时。
12345const int ci = i, &cr = ci;auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)auto d = &i; // d是一个整型指针(整数的地址就是指向整 ...
引用,指针符号的多重含义
像&和*这样的符号,既能用作表达式里的运算符,也能作为声明的一部分。符号上下文决定了符号的含义。
123456int i = 42;int &r = i; // &紧随类型名int出现,因此是声明的一部分,r是一个引用int *p; // *紧随类型名int出现,因此是声明的一部分,p是一个指针p = &i; // &出现在表达式中,是一个取地址符*p = i; // *出现在表达式中,是一个解引用符int &r2 = *p; // &紧随类型名int出现,是声明的一部分;*出现在表达式中,是一个解引用符
摘自C++ primer
py常用数据结构-常用操作
list、tuple
引用、浅拷贝
123456789101112131415161718192021222324252627282930313233343536373839404142434445def shallow_copy(): """ py中,对象分为两类:可变对象,不可变对象。 可变对象: list,dict,set 不可变对象: int,float,str,tuple 浅拷贝中的元素,实际上是对相同对象的引用。 **浅拷贝中可变对象的影响** 对于ori_list中的可变对象,对任意一个list中可变对象的修改,都会影响到另一个list **不影响浅拷贝的情况** 对于ori_list中的不可变对象,对任意一个list中不可变对象的修改,都不会影响到另一个list 详见下面注释 """ list_1 = [0, 1, 2, [3, 4, 5], (6, 7, 8)] list_2 = list_1.copy() # 浅拷贝 ...
py文件处理
json
1234567891011def read_json_lines(): """ 读取.json文件,但.json文件存的是.jsonl的格式 文件末尾是否为空行,都可读取 """ json_path = Path("./tmp_data/ori_val.json") data_list = [] with open(json_path, mode='r', encoding='utf-8') as f: for data in f.readlines(): data_list.append(json.loads(data)) print('done')
12345678910111213def read_json(): """此.json文件,类似报文数据""" json_path ...
含有可变形参的函数
如果函数的实参数量未知,但全部实参类型相同,可使用标准库类型initializer_list的实参,表示某种特定类型的值的数组。
1234567// 常用操作initializer_list<string> lst{ "aaa", "bbb", "ccc" }; // 列表中的元素是constinitializer_list<string> lst_2(lst); // lst_2 = lst; // 拷贝或赋值不会拷贝原列表中的元素。拷贝后原始列表和副本共享元素。lst.size(); // 列表中元素个数lst.begin(); // 返迭代器lst.end(); // 返尾后迭代器
1234567891011void test(int index, initializer_list<string>lst) { cout << index << endl; for (auto itor = lst.begin(); itor != ...