csappp_lab1 题解 1.bitxor 题目描述: bitXor - x^y using only ~ and & Example: bitXor(4, 5) = 1 Legal ops: ~ & Max ops: 14 Rating: 1 解题思路: 利用~和&生成^,简单拆分异或即可,并运用德尔摩根定律 代码: int bitXor(int x, int y) { return ~(~(x & ~y) & ~(~x & y)); } 2.tmin 题目描述…
csappp_lab1 题解 1.bitxor 题目描述: bitXor - x^y using only ~ and & Example: bitXor(4, 5) = 1 Legal ops: ~ & Max ops: 14 Rating: 1 解题思路: 利用~和&生成^,简单拆分异或即可,并运用德尔摩根定律 代码: int bitXor(int x, int y) { return ~(~(x & ~y) & ~(~x & y)); } 2.tmin 题目描述…
ieee浮点表示 ieee浮点表示用下式表示一个数 V=(-1)^S * M * 2^E + 符号 S表示这个数是正数(0)还是负数(1),由单独符号位s直接编码 + 尾数 M是一个二进制小数,由n位小数字段frac编码,同时还依赖阶码字段判断是否为0 + 阶码 E的作用是对浮点数进行加权,权重是2的E次幂,由k位的阶码字段exp编码 在单精度浮点数格式中,s,exp和frac字段分别为1位,k=8位和n=23位,得到一个32位的表示,而双精度浮点数中,在c语言中共64位,s,exp和frac字段分别为1位,k=1…
右值引用 还是谈一谈我对右值引用的理解 有关右值引用的讲解网上有很多,这里就不在一一罗列了 右值引用,毫无疑问是用来解决冗余拷贝的问题的。 比如在拷贝构造函数里实现了深拷贝,那么在某些情况下我们就有可能重复的进行大量资源的拷贝,造成资源的浪费 C++的编译器有对这方面的优化,叫做RVO(return value optimization) 我们在函数返回的时候,不进行一次次的拷贝构造,而是直接将对象构造在他应该放的地方,从而省略了中途冗余的拷贝 但是这毕竟只是编译器做的优化,不能完全帮助我们优化性能,所以有的时候这…
隐含的资源泄露 原文章是《Effective C++》条款17 以独立语句将newed对象嵌入智能指针 考虑这样一个情况 void processWidget(shared_ptr<Widget>, int); int priority(); processWidget需要一个智能指针和一个代表优先级的int,其中优先级可以通过priority获得 那么可能的一种写法就是 processWidget(shared_ptr<Widget>(new Widget), priority()); 那…
RAII 拓展 今天的内容主要取自《Effective C++》 之前有一节我有讲到有关RAII的用法 今天重新回去读了一下effective c++才发现之前自己有一部分理解是错的 这里进行一个纠正,并进行一点对RAII的补充 以对象管理资源的观念被称为RAII,因为我们总是在获得一笔资源后于同一个语句内以他初始化某个资源管理对象 所以对RAII的理解指的是资源管理对象的初始化是在资源获取的同时进行的 所以也可以叫这种资源管理对象RAII对象 智能指针就是一种RAII对象,C++中没有为动态分配数组设计的类似智能…
异常安全性 老样子,先放出第一手信息源 CSDN wiki 今天我们只讨论简单的异常安全 简单点说,异常安全就是保证在执行我们的函数的时候,不会出现资源的破坏,或者泄露的情况 之前讲到的RAII其实就是一种处理情况,即利用了自动析构的特性帮助我们管理资源 这里再来讲一种情况 class A { A &operator= (const A &others) { if (this != &others) { delete ptr; ptr = new T(*others.ptr); } retu…
RAII 先把原文章贴在前面,可以先看原文章有了自己的理解,再来看我说的补充 原文章 RAII(Resource Acquisition Is Initialization) 一些背景的介绍就不多说了,网上讲这个的貌似也不少,这里就说一说自己的理解吧 资源的获取即初始化,其实直观的来说,就是new的组合 记得之前我有一篇文章讲new,当我们在c++中new一个对象的时候,他会首先用operator new来进行空间的分配,然后再执行对象的构建,当分配不成功的时候,对象也不会被成功的构造,这就是RAII直接的意思 我…
stl小应用 前几天有看到一些stl函数,恰好今天的leetcode的每日一题可以让我们把这些函数运用上来 要用到的函数主要有 sort() transform() nth_element() accumulate() 先看题 题意很简单,就是叫我们统计出词频前K大的单词 这里先说我解决这道题的思路,复杂度应该是O(n + klogk)的,理论上是比官方的O(nlogk)要更好一些的 但是应该是我常数写的比较大导致最后结果比较慢 思路就是首先用哈希表统计出每个单词的词频,然后用nth_element来找出前k个,最…
std::accumulate 对于函数式编程的定义较为广泛,大家可以去网上搜一搜 然后在开始之前,我们明确一个概念 能够接收函数作为参数或返回函数作为结果的函数成为高阶函数 C++中的仿函数,lambda表达式让C++函数式编程成为可能 对于我们今天的主角,std::accumulate,他是STL提供的一个高阶函数,可以用来计算集合中所有条目的累加和 使用方法如下 std::accumulate(array.begin(), array.end(), 0) // 前两个参数是容器的迭代器,用于表示开头和结尾 /…
ARTS 第二周打卡 算法: leetcode周赛的最后一题 链接 赛场上没写出来,脱离算法竞赛已经有两年半了,中间自己零零散散的打过几次codeforces,看起来现在做思维题已经是不太在行了 应该给自己一点时间去补一补codeforces的题,稍微训练训练思维能力,否则leetcode周赛不能稳定四题的话,还是比较对不起以前的水平的 这次就是在思维上出了差错,虽然想到了是一根一根的放,但是由于没有考虑到放的顺序,当时我认为是从小的开始放,但是问题就变得复杂了很多 正解是从大的先放,这样换一个角度,问题就会简单很…