blueyi's notes

Follow Excellence,Success will chase you!

0%

由于历史上考虑到不同机器架构在处理不同位宽的整型时性能不同,所以当时的标准要求保证只要不小于某一宽度即可,具体多宽可由编译器自行决定,导致了在使用int或long时在不同机器上可能存在表现不同的情况。这样也大大降低了程序的稳定性和可移植性。C99标准中定义一组固定位宽的整型,在头文件stdint.h中,建议在编程中无特殊原因都使用这些固定位宽的整型,以保证程序在不同的机器构架下整型变量的大小依然相同。对应于C++11中相应的固定位宽的头文件是cstdin。所涉及到的类型主要有:

Read more »

SOF上一个比较全面的回答:http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free
根据理解举例总结如下:
共同点就是都可以用于分配和销毁动态内存。
不同点:
默认是指new/delete :

  1. 在空内存池(Free Store)上分配内存空间,而malloc是在堆上分配,关于free-store和heap的区别可以看这里, 下面会对内存区域详解。http://stackoverflow.com/questions/1350819/c-free-store-vs-heap
Read more »

1.首先明确当类中含有引用类型的成员变量时,编译器会将所有合成的默认构造函数都定义为delete,也就是说编译器将不会合成任何构造函数,所有构造函数必须由用户显式地定义,且该引用变量必须在所有定义的构造函数初始化列表中直接初始化,而不能在构造函数中初始化,形参也必须是引用类型。

Read more »

1.C++11中提供的tuple类型,即元组,该类型类似于pair类型,可以存放不同类型的变量,不同之处是它没有数量限制。该类型定义在头文件tuple中。

2.tuple类型支持常见的操作,如==!=get<i>(t);//获取t中第i个值等。

3.tuple中不但可以存储右值,而且可以存储左值。可以利用tuple让函数一次返回多个值。

Read more »

对SQL的了解一直就那几个语句,关键是那几个语句还经常记不清楚,虽然上过一次数据库的课,但并没有认真听,也没有系统的学习一遍SQL的基础知识,所以对于SQL,基本还处于完全陌生态。趁今晚的闲暇来系统的学习一下SQL相关知识(其实是因为今晚不想学习,权当休闲,哈哈)。
本文内容主要参考:

  • 《SQL必知必会》
  • 《MySQL必知必会》(后来发现有这本书,所以就补上了)

工欲善其事,必先利其器。为了方便后面练习,首先安装MySQL,这里只以Ubuntu下的安装为例

Read more »

删除已经排好序的一维数组中的重复元素,要求时间复杂度为o(n)
方法:使用两个指针,指针front指向当前已经唯一化的最后一个位置,指针after向后遍历需要唯一化的元素,保证front之前的所有元素都始终是唯一的。
当front与after指向的值相同时,after向后移动,当不同时after值赋给front,且front也向后移动。
代码如下:

Read more »

C++中生成随机数即可以使用C语言中的rand和srand的方式,也可以使用C++11中的random类。

cstdlib中伪随机数

C语言中通过函数randsrand来产生伪随机数,这两个函数包含在头文件cstdlib中,其中srand用来产生设置随机数种子,rand每次返回一个当前的种子对应的随机数,这两个函数的声明如下:

1
2
void srand(unsigned seed);
int rand(void);

这两个函数的原型形如:

1
2
3
4
5
6
7
8
9
10
11
12
unsigned long int next = 1;
/* rand: return pseudo-random integer on 0..32767 */
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
/* srand: set seed for rand() */
void srand(unsigned int seed)
{
next = seed;
}

显然rand只能生成整数,需要小数时,只需要跟一个浮点数进行除法即可
一个生成[1, 15]的随机数例子:

Read more »

项目中遇到过的C++问题

auto与const引用问题

1
2
3
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]);
|| ^

错误行处的代码应更正为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应该再智能一点)

Read more »

动态内存与智能指针

1.静态内存用来保存局部static对象,类static数据成员以及定义在任何函数之外的变量。static对象会在第一次使用前分配,程序结束时销毁。栈内存用来保存定义在函数内的非static对象。栈对象仅在其定义的程序块运行时才存在。分配在静态内存和栈内存中的对象由编译器自动创建和销毁。

Read more »