
C++ Primer
yang20141109
这个作者很懒,什么都没留下…
展开
-
自定义string类
自定义一个简化版本的string类,其中成员函数包括:(1)构造函数。(2)赋值构造函数。(3)赋值操作符(=)。(4)重载操作符([])。(5)比较函数。(6)析构函数。非成员函数只有重载操作符MySting();//无参数构造函数MyString(char *pData);//带参数的构造函数const char& operator[](unsigned int len)const;//重原创 2016-01-01 16:18:48 · 514 阅读 · 0 评论 -
STL:set中使用自定义比较操作
set关联容器对关键字类型有一些限制,关键字类型必须定义比较操作,默认情况下,标准库使用关键字类型的<运算符来比较两个关键字。当关键字类型是用户自定义类型时,为了容器中关键字类型正确,我们有三种方式提供正确的关键字类型。 第一中方式:在关键字类型中对#include#includeusing namespace std;class Node{public: int star原创 2016-06-29 11:57:51 · 2548 阅读 · 0 评论 -
C++标准库中next_permutation和pre_permutation实现原理
标准库中next_permutation函数:找当前序列中元素排列的下一个排列,按照字典顺序进行排列。比如说数组排列"123",那么它的下一个排列为"132",并且返回true。如果当前序列没有下一个排列,我们返回false,且把当前排列置为最小的排列,比如说:排列"321",因为该排列已经是最大的排列,所以它没有下一个排列。我们把该排列置为"123",并且返回false。 标准库实现两原创 2016-05-06 17:47:30 · 3591 阅读 · 3 评论 -
容器中swap成员函数
swap操作交换两个相同类型容器中的内容,调用swap函数后,两个容器中的元素将会交换,容器中的元素交换以后会对容器的迭代器、引用、和指针有什么影响。 第一种情况:如果容器是vector,list等容器,交换两个容器的内容的操作保证会很快,因为元素本身并不交换,swap只是交换了两个容器的内部数据结构。其指向容器的迭代器、引用和指针在swap操作之后都不会失效。他们仍然指向swap操作之原创 2016-02-28 11:53:50 · 3530 阅读 · 0 评论 -
容器的emplace成员函数
在C++新标准中引入了三个新成员---emplace_front、emplace、和emplace_back,这些操作是构造而不是拷贝元素。这些操作分别对应分别是push_front、insert、push_back,允许我们将元素放在容器头部、一个指定位置之前或容器尾部。我们以下拿push_back和emplace_push来举例。其他的成员函数原理是一样的。当我们调用push_back函数时,原创 2016-03-01 21:09:27 · 1583 阅读 · 0 评论 -
管理资源类中定义swap函数
在管理资源的类中通常定义一个名为swap的函数,对于那些与重排元素顺序的算法一起使用的类,定义swap函数非常重要,这类算法在需要交换两个元素时会调用swap函数。如果一个类自己定义了一个swap函数,那么算法将使用自己定义的版本,否则算法将使用标准库定义的swap。虽然与往常一样我们不知道swap函数如何实现,但是理论上很容易理解,为了交换两个对象我们需要进行一次拷贝和两次赋值。例如交换类值Ha原创 2015-12-26 12:05:09 · 584 阅读 · 0 评论 -
拷贝赋值运算符处理自我赋值和异常安全检查
拷贝赋值运算符通常应该返回一个指向其左侧运算对象的引用。目的是为了实现连锁赋值操作;比如 x = y = z。其一般形式如下:class Foo{public: Foo& operator=(const Foo &rhs) //返回类型是个reference { ... return *this; //返回左侧对象 }原创 2015-12-25 18:08:59 · 1288 阅读 · 0 评论 -
私有化析构函数
析构函数释放对象使用的资源,并销毁对象的非static数据成员。析构函数是类的成员函数,名字由波浪号加类名构成,没有返回值,也不接受任何参数。析构函数由两部分组成:函数体和析构部分。在一个析构函数中,首先执行函数体,然后执行析构部分。析构函数在以下情况下回自动调用:(1)变量在离开其作用域时被销毁(2)当一个对象被销毁时,其成员也被销毁。(3)当容器被销毁时,容器中的元素也被销毁。(3)对于动态分原创 2015-12-23 11:54:19 · 2087 阅读 · 0 评论 -
C++中对象初始化方式
当对象在创建时获得了一个特定的值,我们说这个对象被初始化。初始化不是赋值,初始化的含义是创建变量赋予其一个初始值,而赋值的含义是把当前值擦除,而以一个新值来替代。 对象初始化可以分为默认初始化、直接初始化、拷贝初始化以及值初始化。 1.默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。如果是内置类型的变原创 2015-12-21 21:32:43 · 10624 阅读 · 0 评论 -
C++中对象生存周期
在C++中,我们所使用的的对象都有严格的生存周期。所谓的对象生存周期是指对象从创建开始到被释放为止的时间。对于静态内存中存储的局部static对象、类static数据成员以及定义在任何函数之外的变量,全局对象(任何函数之外的对象)在程序启动时分配,在程序结束时销毁;对于局部static对象、类static对象在第一次使用前分配内存,在程序结束时销毁。 对于栈内存,用来保存定义在函数内的非原创 2015-12-21 17:39:05 · 901 阅读 · 0 评论 -
自定义简化版本的vector容器
实现一个简单的vector容器,容器中的元素只能容纳整数,默认初始化时,容器的大小为1,且把容器中每个元素的值初始化为0,当向容器中添加元素时,如果此时容器已满,则申请一个新的容器,其大小为原来容器的两倍,并把原先容器中的元素赋值到新容器中,然后再添加新的元素,最后把原来容器的空间给释放。两个容器之间可以相互拷贝,且可以用一个容器构造另一个新的容器。可以用[]操作符访问容器中的元素。其代码如下:#原创 2016-01-01 18:03:07 · 337 阅读 · 0 评论 -
无序容器unorder_map使用自定义类型
unorder_map使用hash函数和关键字类型的==运算符来组织元素,使用hash函数将元素映射到桶中,为了访问一个元素,容器首先计算元素的哈希值,他指出应该搜索那个桶。默认情况下,无序容器使用关键字类型的==运算符来比较元素,它还使用一个hash类型的对象来生成每个元素的哈希值。标准库位内置类型提供了hash模板。包括string类型。但是我们不能直接定义关键类型为自定义类型的无序容器。因此原创 2017-03-16 22:10:26 · 1171 阅读 · 0 评论