404 Not Found

Personal Notes


  • 首页

  • 归档

  • 标签

  • 搜索

《Effective STL》中值得注意的几个条款

发表于 May 1 2015

看完《Effective STL》之后的确有很大的收获,发现 STL 里面的坑还真是不少,这里选了几条我认为比较重要的条款来说一说。

条款9:慎重选择删除元素的方法

STL中的 remove 和 erase 有时候的确会让人比较困惑,下面分三种情况详细讨论各类容器如何使用 remove 和 erase:

1. 要删除容器中有特定值的所有对象:

(1)若容器是 vector、string 或 deque,则使用 erase-remove 习惯用法:

Container<int> c;
c.erase(remove(c.begin(), c.end(), value), c.end());

注意:remove 将值为非 value 的元素依次前移,覆盖值为 value 的元素,返回指向第一个应该废弃的元素的迭代器,不改变容器的大小。

(2)若容器是list,则使用其成员函数 list::remove(当然也可以使用如上方法),即:

c.remove(value); // 无返回值,这是 list 最高效的删除方法

(3)若容器是一个标准关联容器,则使用它的 erase 成员函数,即:

c.erase(value); // 无返回值

阅读全文 »

Leetcode 146:LRU Cache

发表于 Apr 25 2015

这是 Leetcode 146 题,要求实现简单的LRU(Least Recently Used)Cache,解决这道题目的主要思想是:

  1. 使用双向链表(如 STL 中的 list)作为 cache的数据结构,保证在头尾插入和删除的时间复杂度都是 O(1)。每次访问的 Entry 若在 cache 中命中,就将它移到链表头部,若没有命中则分两种情况:若 cache 未满,将新 Entry 插入链表头部;若 cache 满了,先删除链表尾部的 Entry(即最近最少使用的 Entry),再将新 Entry 插入链表头部。
  2. 使用哈希表(如 STL 中的 unordered_map)存储 Entry 的键和 Entry 在 cachae 中位置(如list的迭代器)的映射,可以用 O(1) 时间从 cache 中找到相应的 Entry。
    阅读全文 »

设计模式之单例模式(Singleton)

发表于 Apr 21 2015

实际中存在这样的场景:对于系统中的某些类来说,确保只有一个实例很重要,例如,一个系统只能有一个窗口管理器或文件系统,软件的全局配置信息应该只有一份。单例模式确保一个类只有一个实例,并提供一个全局访问点。全局变量虽然可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。这里介绍几种单例模式的C++实现:

懒汉模式

所谓懒汉模式就是第一次调用 getInstance() 时才产生对象,用到的时候才创建显得比较懒。

方法一: 使用局部静态变量,在C++0x之后才能保证 static 变量构造的线程安全性

class Singleton
{
public:
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}

private:
Singleton() { }
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
阅读全文 »

使用RAII封装互斥锁和条件变量

发表于 Apr 20 2015

最近在看陈硕的《Linux 多线程服务端编程:使用 muduo C++ 网络库》,这算是第一篇读书笔记吧。先介绍三个简单的工具类:MutexLock、MutexLockGuard 和 Condition:

  1. MutexLock 封装临界区(critical section),这是一个简单的资源类,用 RAII(Resource Acquisition Is Initialization)封装互斥锁的创建与销毁,一般作为别的 class 的数据成员。
  2. MutexLockGuard 封装临界区的进入和退出,即加锁和解锁。MutexLockGuard 一般是个栈上对象,它的作用域刚好等于临界区域。
  3. Condition 是对条件变量的简单封装,它有一个 MutexLock 数据成员。如果一个 class 要包含 MutexLock 和 Condition,请注意他们的声明顺序,MutexLock 数据成员应先于 Condition 构造,并作为后者的构造参数。
    阅读全文 »

C++简单String类的实现

发表于 Apr 8 2015

这里给出了C++面试中String类的一种正确写法,我又添加了一些内容,给出完整的代码。其中赋值操作符的实现用到了一些小技巧,具体可以参见《Effective C++》:

  • 条款10:令operator=返回一个reference to *this(支持形如“x = y = z”的连锁赋值)
  • 条款11:在operator=中处理“自我赋值”(考虑异常安全性)
    阅读全文 »
1…789
wind4869

wind4869

44 日志
12 标签
GitHub E-Mail
© 2014 - 2020 wind4869
由 Hexo 强力驱动
主题 - NexT.Pisces
0%