1、C++中产生随机数
需要包含的头文件:
#include<cstdlib>
#include<ctime>
设置随机种子:
srand( time(NULL) );
unsigned int i= rand();
注意:rand()函数产生的随机数的范围在0~RAND_MAX之间,RAND_MAX为 0x7fff(32767)
2、当使用sizeof操作符要求数组的大小时,可以直接通过sizeof(数组名)来获得整个数组的大小,这里的数组可以是一维数组,也可以是二维数组。
3、在某些搜索问题中需要使用hash进行状态判重的时候,
一种方法是可以使用set进行状态的判重(特别是当状态可以用string或int等内置类型表示时,当然复杂类型也是可以的,只要定义适当的opertor==重载函数。
另一种方法就是直接写一个hash,注意hash表的大小要控制好,太小冲突次数多,太大的话同样会影响效率的。hash函数的设计同样要注意到实际问题中状态特点。使用对string求hash值的计算方法其实速度还是挺快的。
4、这里给出一种选择hash表prime大小的方法
bool isPrime(unsigned int num)
{
if( 1 == num || num % 2 == 0)
return false;
if( 2 == num || 3 == num){
return true;
}
for(int i=3 ; i*i <= num ; i++){
if( num % i == 0)
return false;
}
return true;
}
unsigned int nextPrime(unsigned int num){
if( num % 2 == 0)
num++;
for( ; ! isPrime(num) ; num++) ;
return num;
}
int main(){
cout<<nextPrime(1<<18)<<endl;
return 0;
}
4、C++中的bitset容器
包含的头文件:
#include<bitset>
语法:
bitset(); bitset( unsigned long val ); |
C++ Bitsets能以无参的形式创建,或者提供一个长无符号整数,它将被转化为二进制,然后插入到bitset中。当创建bitset时,模板中提供的数字决定bitset有多长。
例子:
bitset<8> a(4);
for(int i=a.size() ; i>=0 ;i--)
cout<<a[i]<<" ";
cout<<endl;
bitset有一个to_string()的成员函数的将二进制形式转化为字符串。
5、关于new操作符
当数据对象是自定义对象时(strut、class),使用new操作符时,系统会自动调用对应的无参数的构造函数对每个内存单元进行初始化。
但是如果使用有参数的构造函数,但带有默认参数时,即使没有无参的构造函数,也是可以编译通过的。
而对于C++中的一些内置数据类型,new操作符,在动态申请的时候,不会自动进初始化。
6、对于bool变量,如果对true值取反,结果仍然为true。
因为~true,即~1,而1在计算机中,用补码表示,所以结果为负数-2。