More Exceptional C++ 读书笔记

本文是《More Exceptional C++》的读书笔记,探讨了C++中的异常安全、构造函数与析构函数、泛型算法、Traits类、模板特化与重载、智能指针的应用等内容。通过实例解释了如何使用如`remove`算法、`CountedPtr`、`FlagNth`等工具,并强调了避免宏、合理优化、使用命名空间以及初始化的重要性。
摘要由CSDN通过智能技术生成

More Exceptional C++ 读书笔记

 Item 1 Switching Streams

 (1): 多考虑易读性,避免编写过渡简洁但是不易懂,不易维护的代码;
  
  记个相当简洁的流切换代码:
  (argc > 2 ? ofstream(argv[2], ios::out|ios::binary) : cout ) << (argc > 1 ? ifstream(argv[1],      ios::in|ios::binary) :  cin).rdbuf();


 (2): 设计函数时
  a: 优先考虑可扩展性,但对于一个简单问题的处理不应当采用过渡设计和过于专一的发放,要权衡这两者;
  b: 多考虑封装,将问题分离开;只要可能,就应当让一段代码只拥有一个功能;


 Item 2Predicates, Part 1: What remove() Removes;

 (1):  remove()删除在[first,last)范围内的所有value 实例remove()以及remove_if()并不真正地
  把匹配到的元素从容器中清除即容器的大小保留不变而是每个不匹配的元素依次被赋
  值给从first 开始的下一个空闲位置上返问的ForwardIterator 标记了新的元素范围的下一个
  位置例如考虑序列{0,1,0,2,0,3,0,4} 假设我们希望删除所有的0 则结果序列是
  {1,2,3,4,0,3,0,4} 1 被拷贝到第一个位置上2 被拷贝到第二个位置上3 被拷贝到第三个位
  置上4 被拷贝到第四个位置上返回的ForwardIterator 指向第五个位置上的0 典型的做法
  是该iterator 接着被传递给erase() 以便删除无效的元素内置数组不适合于使用remove()
  和remove_if()算法因为它们不能很容易地被改变大小由于这个原因对于数组而言
  remove_copy()和remove_copy_if()是更受欢迎的算法.


 (2):   一个remove_nth的正确实现:
  template<FwdIter>
  FwdIter remove_nth(FwdIter first, FwdIter last, size_t  n)
  {
   assert(distance(first, last) >= n);
   advance(first, n);
   if(first != last)
   {
    FwdIter dest = first;
    return copy(++first, last, dest);
   }
   return last;
  }

 (3): 多考虑泛型算法 + 断言的形式,而不是重新实现一个泛型算法;

 (4): 所谓断言是一个函数指针或者函数对象, 返回一个bool,泛型算法依据返回值执行相应操作;

 (5): stateful 断言;不依赖泛型算法传递对象到operator(),而是根据调用次数独立的自动更新函stateful断言内的数据;

 (6): stateful断言对泛型算法的要求:
  a: 泛型算法必须用一个恒定的函数对象,而不能用其拷贝来作运算;
  b: 泛型算法必须把函数对象按照已知的顺序提交给每一个容器中的元素;
  
  c:  一个安全的stateful断言:


  
  template<class T>
  class CountedPtr
  {
  private:
   class Impl
   {
   public:
    Impl(T* pp) : p(pp), refs(1) {}
    ~Impl() { delete p; }
    T*  p;
    size_t refs;
   };
   Impl *impl_;
  public:
   explicit CountedPtr(T *p) : impl_(new Impl(p) ) {}
   ~CountedPtr() { Decrement(); }
   CountedPtr(const CountedPtr &other) : impl_(other.impl_) { Increment(); }
   CountedPtr& operator=(const CountedPtr& othher)
   {
    if(impl_ != other.impl_)
    {
     Decrement();
     impl_ = other.impl_;
     Increment();
    }
    return *this;
   }

   T* operator->() const { return impl_->p;}
   T& operator*() const { return *(impl_->p); }
  private:
   void Dcrement()
   {
    if(--(impl_->refs) == 0)
     delete impl_;
   }
  
   void Increment() { ++(impl_->refs); }
 };


 class FlagNthImpl
 {
 public:
  FlagNthImpl(size_t nn) : i(0), n(nn) {}
  size_t i;
  const size_t n;
 };

 class FlagNth
 {

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: exceptional c指的是超乎寻常的C语言,即在使用C语言进行编程时,达到了非凡的水平和能力。这包括但不限于熟练掌握C语言的语法和特性,理解C语言的底层机制和内存管理,编写高效且可靠的代码,解决复杂而困难的问题。拥有exceptional c能力的程序员通常能够编写高性能的程序,优化代码,改善资源利用效率,提高软件的质量和可维护性。 而more exceptional c则进一步指的是在exceptional c的基础上,更进一步的提升和发展。它可能包括对C语言更深层次的理解,对C语言编程范式、设计模式和最佳实践的掌握,能够设计和实现复杂的数据结构和算法,以及利用C语言的扩展功能和库实现创新的解决方案。 与exceptional c相比,more exceptional c更注重在C语言的高级特性上的应用,如面向对象的编程,泛型编程,元编程等。通过更深入的学习和研究,更出色的C程序员可以利用这些高级技术,进一步提高代码的可读性,可维护性和重用性。 总而言之,exceptional c是对熟练掌握C语言编程的基本要求,而more exceptional c则代表在此基础上进一步提升和发展,拥有更高级的技能和能力。 ### 回答2: exceptional c是指非常优秀的C语言代码,具有出色的设计和实现,能够在效率、可靠性和可读性等方面表现出色。这种代码通常具有良好的算法和数据结构选择,以及正确的错误处理机制。 而more exceptional c是指比exceptional c更加出色的C语言代码,更具有创新和突破性。它可能包含了前沿的编程技术、高级的数据结构和算法,以及更为复杂和深入的问题解决方案。这种代码可能会利用C语言的底层优势,充分发挥计算机性能并提供更高的效率。 在开发过程中,编写exceptional c代码需要遵循良好的编程习惯和规范,保持代码的可维护性和可扩展性。这种代码通常具有清晰的结构和注释,函数和变量命名规范恰当。同时,编写exceptional c代码也要注意错误处理和异常处理,确保代码的健壮性和可靠性。 而more exceptional c则需要更深入的编程知识和技巧。它可能涉及更多的底层编程,例如操作系统级别的代码或者底层硬件的访问。同时,more exceptional c还可能包含更复杂的算法和数据结构,以及高级的设计模式和架构思想。编写more exceptional c代码需要对C语言的特性和底层工作原理有深刻的理解和掌握。 总之,exceptional c和more exceptional c都是指在C语言中表现出色的代码,但more exceptional c更进一步,采用更高级的技术和解决方案,展现出更出色的能力和创新精神。 ### 回答3: exceptional c是指非常出色的c,可能是指一个人的能力或者品质在某个方面超越了常人,表现出非凡的才华或者特点。它强调了c的某种特别之处,使得它在众多同类中脱颖而出。 而more exceptional c则意味着更加出色的c,即在exceptional c的基础上进一步提升,突破了先前的界限,表现出更加突出的表现和才能。它可以指一个人在原有的基础上通过努力和不断学习进步,取得了更加卓越的成就,或者是指一个事物在原有的基础上通过创新和改进,达到了更高的水平。 总之,exceptional c和more exceptional c都表达了某种非凡和出色的意思,但more exceptional c更加强调在原有的基础上取得更高的成就和突破。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值