1 | 有道题是这样的,n组数据,进行如下操作 |
思路:list存储结构体(包含类型与节点),上述插入、交换操作就变成了对链表的操作。若数据量大,vector<int> node;
改完 list<int> node;
1 |
|
此时出现了一个小问题:
for(auto i:s)
for(auto &i:s)
这个bug产生的原因是什么呢?
参考《C++prime》与C++ auto类型说明符如for(atuo &x : s)
如果要更改字符串中的字符值,我们必须将循环变量定义为引用类型。当我们使用引用(别名)作为我们的控制变量时,该变量依次绑定到序列中的每个元素。使用引用,我们可以更改引用所绑定的字符。for循环中的每个迭代初始化一个新的引用。
for(auto i:s)会拷贝一份s中的元素,而不会改变s中元素; 特例:使用for(auto x:vector<bool>)
时得到一个proxy class,操作时会改变vector<bool>
本身元素。
for(auto &i:s):s中的元素的别名,可修改元素值;特例:当vector<bool>
返回临时对象,使用auto&会编译错误,临时对象不能绑在non-const l-value reference (左值引用),需使用auto&&
,初始化右值时也可捕获(右值引用)
总结:
如果只是访问容器,for(auto i:s)与for(auto &i:s)作用类似;
但是访问的同时进行改变其值,那就for(auto &i:s)没得跑,或者选用迭代器;
想要只读元素:for(const auto& i:s) 不会像for(auto i:s)一样产生拷贝开销,也不会像for(auto &i:s)改变元素值。
ps:回顾 auto(自动类型推断) 、static、new
auto 的对应类型(既不是new 出来,也不是static变量),它只是该作用域(可能是函数体内、for内)定义的局部变量。C++中auto定义的变量必须初始化(因编译器推断变量或表达式的类型),而C中auto关键字修饰的变量默认为int 型数据
static 变量(无论全局还是局部)是程序结束的时候才释放对象的,但它不需要手动释放,保存在全局区。
(1)static 如果在一个函数内申明,这每次进入这个函数时,还是使用第一次声明的变量,并且还保存的上次使用的值【用于“记忆化”】。
(2)static 变量如果在结构和类中使用,这结构或类定义的一切对象,都将共享唯一 static 变量(所以需要类外初始化)。
new创建存储在堆区的变量,必须手动释放(delete),避免内存泄漏。