C/C++拾遗之函数对象
函数对象即是定义了函数调用运算符()的类的对象,该类表现上像个函数,参见http://notes.maxwi.com/2015/12/13/CPP-OOP/#函数调用运算符
通过函数对象的方式即简洁又可以方便地实现调用含有不同参数类型的函数对象
以下代码分别使用函数对象和函数指针进行举例:
函数对象即是定义了函数调用运算符()的类的对象,该类表现上像个函数,参见http://notes.maxwi.com/2015/12/13/CPP-OOP/#函数调用运算符
通过函数对象的方式即简洁又可以方便地实现调用含有不同参数类型的函数对象
以下代码分别使用函数对象和函数指针进行举例:
1.首先明确当类中含有引用类型的成员变量时,编译器会将所有合成的默认构造函数都定义为delete,也就是说编译器将不会合成任何构造函数,所有构造函数必须由用户显式地定义,且该引用变量必须在所有定义的构造函数初始化列表中直接初始化,而不能在构造函数中初始化,形参也必须是引用类型。
1.C++11中提供的tuple类型,即元组,该类型类似于pair类型,可以存放不同类型的变量,不同之处是它没有数量限制。该类型定义在头文件tuple中。
2.tuple类型支持常见的操作,如==、!=、get<i>(t);//获取t中第i个值等。
3.tuple中不但可以存储右值,而且可以存储左值。可以利用tuple让函数一次返回多个值。
对SQL的了解一直就那几个语句,关键是那几个语句还经常记不清楚,虽然上过一次数据库的课,但并没有认真听,也没有系统的学习一遍SQL的基础知识,所以对于SQL,基本还处于完全陌生态。趁今晚的闲暇来系统的学习一下SQL相关知识(其实是因为今晚不想学习,权当休闲,哈哈)。
本文内容主要参考:
工欲善其事,必先利其器。为了方便后面练习,首先安装MySQL,这里只以Ubuntu下的安装为例
本文所使用的环境:
需要用到的工具(都是系统自带的,以下是man的基本信息,详细信息可以直接查看man手册):
如果对编译过程不甚了解,可以参看这里实例验证C/C++源代码如何变成程序的过程
本来只是为了从底层了解下堆和栈的区别,以及heap和free-store的区别,结果便引出了从源代码编译开始,直到可执行程序如何加载到内存,以及C/C++内存布局的问题,这里做个总结,主要参考C++ Internals :: Memory Layout
本文所使用的环境:
需要使用的其他工具:
C++编译器通常进行以下4个步骤将源代码编译为可执行程序:
以下面这段代码的编译链接过程举例:
删除已经排好序的一维数组中的重复元素,要求时间复杂度为o(n)
方法:使用两个指针,指针front指向当前已经唯一化的最后一个位置,指针after向后遍历需要唯一化的元素,保证front之前的所有元素都始终是唯一的。
当front与after指向的值相同时,after向后移动,当不同时after值赋给front,且front也向后移动。
代码如下:
C++中生成随机数即可以使用C语言中的rand和srand的方式,也可以使用C++11中的random类。
C语言中通过函数rand和srand来产生伪随机数,这两个函数包含在头文件cstdlib中,其中srand用来产生设置随机数种子,rand每次返回一个当前的种子对应的随机数,这两个函数的声明如下:
1 | void srand(unsigned seed); |
这两个函数的原型形如:
1 | unsigned long int next = 1; |
显然rand只能生成整数,需要小数时,只需要跟一个浮点数进行除法即可
一个生成[1, 15]的随机数例子:
项目中遇到过的C++问题
1 | error: invalid initialization of non-const reference of type 'std::_Rb_tree_const_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >&' from an rvalue of type 'std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::const_iterator {aka std::_Rb_tree_const_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >}' |
错误行处的代码应更正为auto valpair = con.find(valname[cont]);或者const auto &valpair = con.find(valname[cont]);
错误原因:
map的find成员函数返回的迭代器有可能是const,例如此处传递给函数的map是一个const引用,返回将是一个const的迭代器。而auto此时进行类型推断时,由于使用的是引用,所以auto默认推断的类型为非const的引用。根据修改的内容,显然当不是引用时,auto推断就是const的了;或者手动在auto前面添加一个const。(话说auto应该再智能一点)