[C++]C++ 11/14 笔记(三)
本部分介绍了c++11的容器、智能指针和正则。
std::array
代替原来的c数组,提供了size(),empty(),大小比较以及迭代器。
注意:
- 声明的第二个模板参数必须是编译期常量
- 不能隐式转换为指针,调用data()返回c数组地址
|
|
std::forward_list
单向实现的列表,提供了O(1)的插入,并且比双向更省空间。
无序容器
传统 C++ 中的有序容器 std::map/std::set
,这些元素内部通过红黑树进行实现,插入和搜索的平均复杂度均为 O(log(size))。在插入元素时候,会根据 < 操作符比较元素大小并判断元素是否相同,并选择合适的位置插入到容器中。当对这个容器中的元素进行遍历时,输出结果会按照 < 操作符的顺序来逐个遍历。
而无序容器中的元素是不进行排序的,内部通过 Hash 表实现,插入和搜索元素的平均复杂度为 O(constant),在不关心容器内部元素顺序时,能够获得显著的性能提升。
C++11 引入了两组无序容器:std::unordered_map
, std::unordered_multimap
和std::unordered_set
, std::unordered_multiset
。
它们的用法和原有的std::map/std::multimap/std::set/set::multiset
基本类似。
std::tuple
提供了N元组的数据结构。
该数据结构在cpp14中还不够完善。
智能指针
在传统 C++ 里我们使用 new 和 delete 去『记得』对资源进行释放。而 C++11引入了智能指针的概念,使用了引用计数的想法,让程序员不再需要关心手动释放内存。这些智能指针包括 std::shared_ptr/std::unique_ptr/std::weak_ptr
,使用它们需要包含头文件 <memory>
。
std::shared_ptr
std::shared_ptr
是一种智能指针,它能够记录多少个shared_ptr
共同指向一个对象,从而消除显示的调用 delete
,当引用计数变为零的时候就会将对象自动删除。
std::make_shared
会分配创建传入参数中的对象,并返回这个对象类型的std::shared_ptr
指针。
|
|
std::shared_ptr
可以通过get()
方法来获取原始指针,通过reset()
来减少一个引用计数,并通过get_count()
来查看一个对象的引用计数。
std::unique_ptr
std::unique_ptr
是一种独占的智能指针,它禁止其他智能指针与其共享同一个对象,从而保证了代码的安全:
|
|
在c++11中需要手动实现
|
|
既然是独占,换句话说就是不可复制。但是,我们可以利用std::move
将其转移给其他的unique_ptr
。
std::weak_ptr
当对象相互引用导致内存泄露时,让其中一个使用std::weak_ptr
就可以解决了。(弱引用)
正则
std::regex
创建模式对象。(注意所有转义需要二次转义)
std::regex_match(字符串, 模式对象)
会返回是否匹配(true & false)
|
|
更复杂的用法:
|
|