become-expert-in-cpp

本文探讨了C++编程中的关键概念和技术,包括资源管理(RAII)、指针与引用的区别、C++风格类型转换的使用、多态数组的问题、无效默认构造函数的影响、智能指针的设计以及现代C++设计模式。文章还介绍了多项性能优化技巧,并针对类设计提供了实用建议。
notes-on-effective-cpp
----------------------
item13 以对象管理资源(RAII)
  1)[ Lambda + tr1::function ] VS [ auto_ptr ]   

item32 确定你的public继承正确模塑出is-a关系

item35 考虑virtual以外的方案
  1)
  2)

item


notes-on-more-effective-cpp
---------------------------
item01 指针和引用
  1)指针可以指向空值,引用必须在初始化时就指定对象
  2)指针可以变更指向的对象,引用从始至终无法改变

item02 尽量使用C++风格的类型转换
  1)static_cast<double>(first_number)
  2)const_cast<SpecialWidget*>(&csw)
  3)dynamic_cast<SpecialWidget*>(pw)
  4)reinterpret_cast<FuncPtr>(&do_something)

item03 不要对数组使用多态
  @@a[i]的指针算法还很原始

item04 避免无用的缺省构造函数
  合理:行为特性与数字相仿的对象被初始化为空值或不确定的值
        链表、哈希表等数据结构初始化为空容器
  不合理:无意义

  禁止缺省构造函数的不方便之处
    1)数组
    2)无法在许多基于模板的容器类使用
       template<class T>
       class Array {
       public:
         Array(int size);
         ...
       private:
         T* data; 
       };

       template<class T>
       Array<T>::Array(int size)
       {
         data = new T[size]; //为每个数组元素依次调用T::T()
       }
    3)虚基类的设计

item16 80-20 rule
  @@多数人遇到性能问题时都会信心满满的快速猜出瓶颈所在,
  @+通常的后果是陷入越来越深的泥沼中,索性推倒重来,从
  @+一开始就使用profiler

item17 Lazy Evaluation
  据说具有五年工龄的C++程序员才具有这种意识
  1)C++ string类的COW机制
  2)惰性数据库读取

item18 over-eager evaluation
  1)cache 
  2)prefetch

item19 临时对象
  1)call-by-value
  2)call-by-reference-to-const
  3)函数返回对象

item20 返回值优化
  1)C++11貌似解决了这个问题
     @@学习计算机以来第一次觉得这是我们的时代的感觉

item21 通过重载避免隐式类型转换
  @@以前从来没见识过这种方法
  @@每一个重载的operator必须带有一个用户自定义类型的参数,
  @+防止用户定义出类似const Type operator+(int a, int b)
  @+这样扰乱内置类型的操作

item22 用operator+=实现operator+
  @@以前不熟悉这种用法  

item23 考虑变更程序库
  @@举了个例子用stdio代替iostream
  @+不过貌似通过替代库提升效率的
  @+可用性不大

item24 理解虚函数、多重继承、虚基类和RTTI
  @@vtable:该类和父类里所有的虚函数指针表
  @+        一个类应该只有一份拷贝
  @@  vptr:从对象找到正确vtable的指针
  @+        嵌入到每个对象中  


Modern-CPP-design
-----------------
  1) policy based class design(编译器策略模式?)
     do-it-all接口?
       @@面向接口 | 组合优于继承 | 可插拔 == 策略模式??
     多重继承是救世主么?
     policy接口和class接口的不同?
       定义“怎样的语法构造符合其所规范的class”而非“必须实现哪些函数”
       @@policy似乎更加贴近设计更加抽象

  2)智能指针
     使指针具备值语义(比如int)
     |-- 拥有权
     |   |-- Deep Copy(拷贝指针时同时拷贝指向的对象)
     |   |   |-- 保持多态性?vtable中加入clone多态行为
     |   |   
     |   |-- Copy on Write
     |   |   |-- !!没办法!!
     |   |
     |   |-- Reference Counting
     |   |   |-- reference-count放在哪里?
     |   |   |   独立存在 | 简单的wrapper类 | 侵入到被指向对象
     |   |
     |   |-- Destructive Copy(std::auto_ptr)
     |       |-- 转移资源
     |
     |-- 隐式转换(smart pointer至raw pointer的转换)
     |   |-- 确定要放弃我们精心实现的管理机制么?GetImpl
     | 
     |-- 相等性和不相等性
     |
     |-- Checking(初始化空值 | deference前测试)
     |
     |-- const语义
     |
     |-- 数组
     |
     |-- 多线程

     声明
       template
       <
         typename T,
         template <class> class OwnershipPolicy = RefCounted,
         class ConversionPolicy = DisallowConversion,
         template <class> class CheckingPolicy = AssertCheck,
         template <class> class StoragePolicy = DefaultSPStorage
       >
       class SmartPtr;


The-Design-and-Evolution-of-C++
-------------------------------
TODO


Google-CPP-style
----------------
class
  |-- 构造函数
  |   |-- 构造函数体绝对不要调用virtual函数或者造成致命错误
  |  
  |-- 缺省构造函数
  |   |-- 如果没有其他的构造函数,则必须自定义一个构造函数,将
  |       成员变量初始化为一个可控连续的状态
  |
  |-- explicit
  |   |-- 所有的单参数构造函数必须用explicit限制
  |   |-- 使用强制转型解决带来的不便
  |
  |-- 禁止拷贝构造函数和赋值运算符重载
  |   |-- STL容器中存储智能指针
  |   |-- 函数以指针或引用形式传递参数
  |
  |-- 继承
  |   |-- 实现继承造成基类与子类之间的紧耦合-使用组合代替
  | 
  |-- 接口
  |
  |-- 操作符重载(禁止)
  |  
  |-- 访问控制(私有)
  |
  |-- 声明顺序(友元函数放在private中)
  |   |-- typedefs and enum
  |   |-- static/const成员
  |   |-- constructor
  |   |-- destructor
  |   |-- method(包括静态方法)
  |   |-- 数据成员
  |       
  |-- write small and focused functions  



Composition-versus-Inheritance
------------------------------
 inheritance是is-a的关系
 composition是has-a的关系
 TODO

转载于:https://www.cnblogs.com/Anney/archive/2012/12/30/2840069.html

# T617559 「TPOI-5A」Luminescence ## 题目背景 ![](https://cdn.luogu.com.cn/upload/image_hosting/ownsj515.png) (图片来自 Phigros 曲绘,侵删。) ## 题目描述 给定 $n$ 两个长度为 $n$ 的序列 $a,b$。定义一个 $0\sim n-1$ 的排列 $q$ 是 **魔怔的**,当且仅当: - $\forall 1\le k\le n,\min^k_{i=1}q_i=a_k$。 - $\forall 1\le k\le n,\min^n_{i=k}q_i=b_k$。 定义一个排列 $q$ 的权值为 $\sum_{1\le l\le r\le n}\operatorname{mex}_{l\le i\le r}q_i$,求所有魔怔的排列的权值之和。答案对 $998244353$ 取模。 一个集合 $M$ 的 $\operatorname{mex}(M)$ 定义为最小的没有在 $M$ 中出现的自然数。如 $\text{mex}\{1,2,3,4\}=0,\text{mex}\{0,1,3,4\}=2$。 ## 输入格式 本题有多组测试数据。对于每个测试点,先输入一个正整数 $T$,表示数据组数。 对于每一组测试数据,第一行一个正整数 $n$, 第二行输入 $n$ 个整数 $a_1,a_2,\dots,a_n$,第三行 $n$ 个整数 $b_1,b_2,\dots,b_n$。 ## 输出格式 对于每一组测试数据,输出一行一个整数,表示所有魔怔的排列的权值之和。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 4 0 0 0 0 0 1 2 3 4 1 0 0 0 0 0 2 2 4 0 0 0 0 0 1 1 1 ``` ### 输出 #1 ``` 10 11 14 ``` ## 说明/提示 |$\text{Subtask}$|$n\le$|$\sum n\le$|分值| |:-:|:-:|:-:|:-:| |$1$|$8$|$800$|$20$| |$2$|$10^3$|$10^4$|$40$| |$3$|$2\times10^5$|$2\times10^6$|$40$| 对于 $100\%$ 的数据,$1 \le n \le 2 \times 10^5,0 \le a_i,b_i < n, \sum n \le 2 \times 10^6$。 **对于每组数据保证存在至少一个魔怔的排列。** c++,不用vector,注释
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值