摘要: 在使用vector的过程中,有时会遇到需要循环遍历vector,并删除符合指定条件的元素。 当“指定条件”不复杂时,应该尽量使用erase(remove_if(begin, end, func), end)的形式来完成功能。 但有时候“指定条件”过于复杂,不得不显式地写一个for循环来处理。我们必须小心在意erase所带来的side effect,一个一般性的for循环如下: 1 for (std::vector<int>::iterator it = intVec.begin(); it != intVec.end(); /**/) 2 { 3 if (*it... 阅读全文
posted @ 2012-04-19 22:12 carter2000 阅读(6836) 评论(0) 推荐(0) 编辑
摘要: 对于尾递归,以前的理解仅局限于它是递归和尾调用的终极合体,比普通递归效率高。至于效率为什么高,高在哪,一直没有深究过,现在补上。要说尾递归,得先说尾调用。我理解的尾调用大概是这么一种情况:函数A里面调用了函数B。函数B执行后,函数A马上返回。也就是说调用函数B(并返回执行结果)是函数A所做的最后一件事。相当于执行完函数B后,函数A也就执行完。因此在执行函数B时,函数A的栈帧其实是已经大部分没用了,可以被修改或覆盖。编译器可以利用这一点进行优化,函数B执行后直接返回到函数A的调用者。这里有一点需要注意:它是来自于编译器的优化。这一点点的优化对于普通的尾调用来说可能意义不大,但是对于尾递归来说就很 阅读全文
posted @ 2012-04-19 22:00 carter2000 阅读(1540) 评论(5) 推荐(1) 编辑