C/C++编程的常识和注意点(不断更新)
2017-04-08 16:28
148 查看
由于编程过程中经常会遗忘一些C/C++的代码编写规则、函数使用规则(参数和返回值含义)等,所以每次都重新查阅百度,非常麻烦,所以稍微整理一下它们的注意点和知识点,欢迎指正~
String(字符串类):string类的用法总结
List(双向链表):list用法详解
Stack(栈)、Queue(队列)、Priority_queue(优先队列):stack/queue/priority_queue的使用方法
Deque(双向队列):deque容器详解
Set(有序集合):set容器的总结
Map(键值对容器):Map常见用法说明
数据类型的输入输出格式(Mingw64_GCC)
需要注意的是
C语言中输出浮点数(不管是float还是double)都是”%f”,如果用”%lf”会输出0.00000;”%.xlf”表示保留x位小数。
C++中输出浮点数默认为6位数据(含小数点,如123.45);
C++设置浮点数输出位数:
在%和d之间插入数字来读取特定位数:例如,输入时用%4d来读取八位数的前四位年份,%2d%2d来读取月和日,比手动截取字符串子串方便多了:)
浮点数与整型数尽量不要用==或!=比较。浮点数在运算时容易丢失精度,导致比较时发生异常,比如下面的程序会导致死循环,如果非要比较,请用floor(i)或强制类型转换:
读入char字符
当读入的这一行字符串中含有空格时,不能用scanf读入,需要用fgets(尽量不要用gets),或者while循环里一个一个getchar()
涉及到调用getchar()、fgets(),要想清楚上一次的输入是否造成缓冲区有残留,否则要在调用前getchar()吞掉多余的回车或无用字符。
类似陷阱:http://blog.csdn.net/lecholin/article/details/70147512
编程中无穷大常量可以设置为0x3f3f3f3f:http://blog.csdn.net/xiangyong58/article/details/24927699
尽量用
尝试调用
定义类、结构体时重载运算符:
返回值为bool类型的比较符(<, >, ==, !=)
bool operator 比较符 (const 结构体名 &b) const
{
return (比较成立的条件); //注意比较时主元直接使用元素名或用this->元素名;
}
例如:
bool operator < (const point &b) const
{
return this->elem > b.elem; //对point结构体的elem降序
}
返回值为结构体类型的运算符(+, -, *, /, =)
结构体名& operator 运算符 (结构体名& b)
{
//结构体内变量的计算
r
c904
eturn *this;
}
例如:
POINT& operator + (POINT& b)
{
this->str += b.str;
this->num += b.num;
return *this;
}
一般来说,在调用的函数内对形参的修改不会导致实参发生变化,比如在C中调用自定义函数
传指针,即
传引用(C++推荐),即
利用现有的模板函数,如STL algorithm里的swap,兼容数据类型更强大
数据量不大,且涉及空格切分的字符串时,可以利用字符串流stringstream(头文件sstream),把一行中的string作为流进行读写,比如给定一行由空格分隔的整数,求这些整数和,代码如下:
常用STL、库函数
STL
Vector(动态数组):vector用法总结String(字符串类):string类的用法总结
List(双向链表):list用法详解
Stack(栈)、Queue(队列)、Priority_queue(优先队列):stack/queue/priority_queue的使用方法
Deque(双向队列):deque容器详解
Set(有序集合):set容器的总结
Map(键值对容器):Map常见用法说明
库函数
C语言string.h:string.h中常用函数memset(b, a, sizeof(int)*k)用于将数组a中的k个int单元复制到b所指向的数组
数值类型
C语言中常用的基本数据类型的取值范围数据类型 | 字节数 | 取值范围(数量级) |
---|---|---|
char | 1 Bytes | -128 ~ +127 |
int (long) | 4 Bytes | -2147483648 ~ +2147483647 (1010) |
unsigned int | 4 Bytes | 0 ~ 4294967295 (1010) |
long long int | 8 Bytes | -9223372036854775808 ~ +9223372036854775807 (1020) |
double | 8 Bytes | ±1.7 * 10308 (有效精度16位) |
数据类型 | 输入格式 | 输出格式 |
---|---|---|
char | scanf(“%c”, &c); cin >> c; | printf(“%c”,c); cout << c; |
int | scanf(“%d”, &a); cin >> a; | printf(“%d”, a); cout << a; |
double | scanf(“%lf“,&a); cin >> a; | printf(“%f“, a); cout << a; |
string | scanf(“%s”, str); cin >> str; | printf(“%s”,str); cout << str; |
C语言中输出浮点数(不管是float还是double)都是”%f”,如果用”%lf”会输出0.00000;”%.xlf”表示保留x位小数。
C++中输出浮点数默认为6位数据(含小数点,如123.45);
C++设置浮点数输出位数:
#include "iomanip"
cout << setiosflags(ios::fixed) << setprecision(4)<< a <<endl; //浮点数形式
cout << setiosflags(ios::scientific) << setprecision(4) << a << endl; //指数形式 printf("%e", a);
在%和d之间插入数字来读取特定位数:例如,输入时用%4d来读取八位数的前四位年份,%2d%2d来读取月和日,比手动截取字符串子串方便多了:)
浮点数与整型数尽量不要用==或!=比较。浮点数在运算时容易丢失精度,导致比较时发生异常,比如下面的程序会导致死循环,如果非要比较,请用floor(i)或强制类型转换:
int main(int argc, char const *argv[]) { double i; for (i = 0; i != 10; i += 0.1) //用floor(i)或(int)i比较不会导致死循环 printf("%.1f\n", i); return 0; }
读入char字符
当读入的这一行字符串中含有空格时,不能用scanf读入,需要用fgets(尽量不要用gets),或者while循环里一个一个getchar()
涉及到调用getchar()、fgets(),要想清楚上一次的输入是否造成缓冲区有残留,否则要在调用前getchar()吞掉多余的回车或无用字符。
类似陷阱:http://blog.csdn.net/lecholin/article/details/70147512
编程中无穷大常量可以设置为0x3f3f3f3f:http://blog.csdn.net/xiangyong58/article/details/24927699
数据结构
每个进程/线程的栈空间大小是有限的,而局部变量的内存是在栈上分配的,如果局部变量过大,则会出现分配失败的情况。所以当声明数组比较大的时候,应将其声明在全局变量,或者malloc动态申请内存于堆上。函数规则
对于大量数据的读入,cin的效率不及scanf,原因是C++中cin为了和scanf保持同步, 使可以混用两种方法,不至于文件指针乱码导致发生错误,牺牲掉了一点效率。解决办法如下:尽量用
scanf()
尝试调用
std::ios::sync_with_stdio(false),关闭与stdio的同步,据说效率能和C差不多(https://www.byvoid.com/zhs/blog/fast-readfile)
定义类、结构体时重载运算符:
返回值为bool类型的比较符(<, >, ==, !=)
bool operator 比较符 (const 结构体名 &b) const
{
return (比较成立的条件); //注意比较时主元直接使用元素名或用this->元素名;
}
例如:
bool operator < (const point &b) const
{
return this->elem > b.elem; //对point结构体的elem降序
}
返回值为结构体类型的运算符(+, -, *, /, =)
结构体名& operator 运算符 (结构体名& b)
{
//结构体内变量的计算
r
c904
eturn *this;
}
例如:
POINT& operator + (POINT& b)
{
this->str += b.str;
this->num += b.num;
return *this;
}
一般来说,在调用的函数内对形参的修改不会导致实参发生变化,比如在C中调用自定义函数
int swap(int a, int b),引入临时变量t交换a和b的值,是不会改变main函数调用时的实参的值的。解决办法:
传指针,即
int swap(int*a, int *b),再改变*a和*b中的值,实现真正交换。
传引用(C++推荐),即
int swap(int &a, int &b),实现by reference而不是by value,避免指针的问题
利用现有的模板函数,如STL algorithm里的swap,兼容数据类型更强大
数据量不大,且涉及空格切分的字符串时,可以利用字符串流stringstream(头文件sstream),把一行中的string作为流进行读写,比如给定一行由空格分隔的整数,求这些整数和,代码如下:
#include "iostream" #include "string" #include "sstream" using namespace std; int main(int argc, char const *argv[]) { string line; while(getline(cin, line)) //读入一行字符串 { int sum = 0, x; stringstream ss(line); //line构造stringstream while (ss >> x) //流读出 sum += x; cout << sum << endl; } return 0; }
相关文章推荐
- C++中要注意的小细节(不断更新中……)
- C++中要注意的小细节(不断更新中……)
- 个人编程规范(不断更新)
- C++ 有价值blog索引(不断更新)
- C和C++里面常见错误和异常出现怎么解决总结(不断更新)
- 《林锐:高质量C/C++编程指南》指针注意的地方
- 一些编程小技巧----不断更新中
- 关于cpp的一些常识FAQ(不断更新)
- c++文件目录操作点滴总结(不断更新)
- C++中各种核心思想(将不断更新)
- 个人编程体会的集合(不断更新)
- C++ 牛人博客(不断更新中...)
- nginx lua使用注意事项(开发过程中会不断更新)
- VS2012_MVC4入门例子、代码视图分离办法、需要注意的坑爹问题等_被坑后不断更新此贴,要转载的话,请使用链接,不要转载内容
- C++头文件有关内容(不断更新)
- c++ 编程注意事项和知识点
- C/C++ 基础知识学习笔记 (不断更新中)
- C++ 有价值blog索引-分类索引(不断更新)
- 三星线刷卡刷常见刷机注意事项及其步骤(不断更新)
- Ibatis.Net和Ibatis使用注意点及异同点(不断更新)