由于历史上考虑到不同机器架构在处理不同位宽的整型时性能不同,所以当时的标准要求保证只要不小于某一宽度即可,具体多宽可由编译器自行决定,导致了在使用int或long时在不同机器上可能存在表现不同的情况。这样也大大降低了程序的稳定性和可移植性。C99标准中定义一组固定位宽的整型,在头文件stdint.h中,建议在编程中无特殊原因都使用这些固定位宽的整型,以保证程序在不同的机器构架下整型变量的大小依然相同。对应于C++11中相应的固定位宽的头文件是cstdin。所涉及到的类型主要有:
C/C++拾遗之new/delete与malloc/free的异同
SOF上一个比较全面的回答:http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free
根据理解举例总结如下:
共同点就是都可以用于分配和销毁动态内存。
不同点:
默认是指new/delete :
- 在空内存池(Free Store)上分配内存空间,而malloc是在堆上分配,关于free-store和heap的区别可以看这里, 下面会对内存区域详解。http://stackoverflow.com/questions/1350819/c-free-store-vs-heap
C/C++拾遗之函数对象
函数对象即是定义了函数调用运算符()
的类的对象,该类表现上像个函数,参见http://notes.maxwi.com/2015/12/13/CPP-OOP/#函数调用运算符
通过函数对象的方式即简洁又可以方便地实现调用含有不同参数类型的函数对象
以下代码分别使用函数对象和函数指针进行举例:
C/C++拾遗之类成员含引用变量
1.首先明确当类中含有引用类型的成员变量时,编译器会将所有合成的默认构造函数都定义为delete
,也就是说编译器将不会合成任何构造函数,所有构造函数必须由用户显式地定义,且该引用变量必须在所有定义的构造函数初始化列表中直接初始化,而不能在构造函数中初始化,形参也必须是引用类型。
C/C++拾遗之tuple类型
1.C++11中提供的tuple类型,即元组,该类型类似于pair类型,可以存放不同类型的变量,不同之处是它没有数量限制。该类型定义在头文件tuple中。
2.tuple类型支持常见的操作,如==
、!=
、get<i>(t);//获取t中第i个值
等。
3.tuple中不但可以存储右值,而且可以存储左值。可以利用tuple让函数一次返回多个值。
SQL学习总结
对SQL的了解一直就那几个语句,关键是那几个语句还经常记不清楚,虽然上过一次数据库的课,但并没有认真听,也没有系统的学习一遍SQL的基础知识,所以对于SQL,基本还处于完全陌生态。趁今晚的闲暇来系统的学习一下SQL相关知识(其实是因为今晚不想学习,权当休闲,哈哈)。
本文内容主要参考:
- 《SQL必知必会》
- 《MySQL必知必会》(后来发现有这本书,所以就补上了)
工欲善其事,必先利其器。为了方便后面练习,首先安装MySQL,这里只以Ubuntu下的安装为例
唯一化有序数组
删除已经排好序的一维数组中的重复元素,要求时间复杂度为o(n)
方法:使用两个指针,指针front指向当前已经唯一化的最后一个位置,指针after向后遍历需要唯一化的元素,保证front之前的所有元素都始终是唯一的。
当front与after指向的值相同时,after向后移动,当不同时after值赋给front,且front也向后移动。
代码如下:
C++随机数类random的使用
C++中生成随机数即可以使用C语言中的rand和srand的方式,也可以使用C++11中的random类。
cstdlib中伪随机数
C语言中通过函数rand
和srand
来产生伪随机数,这两个函数包含在头文件cstdlib
中,其中srand
用来产生设置随机数种子,rand
每次返回一个当前的种子对应的随机数,这两个函数的声明如下:
1 | void srand(unsigned seed); |
这两个函数的原型形如:
1 | unsigned long int next = 1; |
显然rand只能生成整数,需要小数时,只需要跟一个浮点数进行除法即可
一个生成[1, 15]的随机数例子:
实战中遇到的C++问题汇总
项目中遇到过的C++问题
auto与const引用问题
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应该再智能一点)