C++用法总结
1.C++的绝对值符号
如果是整形的,就是abs()
如果是浮点型的,是fabs()
这两个函数都从属于库函数math.h
#include <cmath>
or
#include<math.h>
abs(int)
fabs(float)
2.fscanf读取文件里的浮点数的问题
http://bbs.csdn.net/topics/310120431
#include <stdio.h> main()
{
FILE *fp;
long double x;
fp = fopen("1.txt", "r");
fscanf(fp,"%Lf",&x);
printf("%Lf\n", x);
printf("%.4Lf\n", x); fscanf(fp,"%Lf",&x);
printf("%lf\n", x);
printf("%.4Lf\n", x);
}
3. vector中resize()和reserve()区别 http://blog.csdn.net/jocodeoe/article/details/9230879
先看看《C++ Primer》中对resize()函数两种用法的介绍:
1、resize(n)
调整容器的长度大小,使其能容纳n个元素。
如果n小于容器的当前的size,则删除多出来的元素。
否则,添加采用值初始化的元素。
2、 resize(n,t)
多一个参数t,将所有新添加的元素初始化为t。
而reserver()的用法只有一种
reserve(n)
预分配n个元素的存储空间。
了解这两个函数的区别,首先要搞清楚容器的capacity(容量)与size(长度)的区别。
size指容器当前拥有的元素个数;
而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。
也可以说是预分配存储空间的大小。
resize()函数和容器的size息息相关。调用resize(n)后,容器的size即为n。
至于是否影响capacity,取决于调整后的容器的size是否大于capacity。
reserve()函数和容器的capacity息息相关。
调用reserve(n)后,若容器的capacity<n,则重新分配内存空间,从而使得capacity等于n。
如果capacity>=n呢?capacity无变化。
从两个函数的用途可以发现,容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。
而reserve()函数预分配出的空间没有被初始化,所以不可访问。
一个简单的测试用例:
vector<int> a;
a.reserve();
a.resize();
cout<<a.size()<<" "<<a.capacity()<<endl;
a.resize();
cout<<a.size()<<" "<<a.capacity()<<endl;
a.reserve();
cout<<a.size()<<" "<<a.capacity()<<endl;
a.resize();
cout<<a.size()<<" "<<a.capacity()<<endl;
4.[c++]在C++中定义常量的两种方法的比较http://www.cnblogs.com/huhu0013/archive/2010/09/13/1824987.html
常量是定以后,在程序运行中不能被改变的标识符。C++中定义常量可以用#define 、const 这两种方法。例如:
#define PRICE 10 //定义单价常量10
const int PRICE = 10; //定义单价常量10
其实用常量是有它的理由的,下面我们来看下面两段程序对比
#include <iostream>
using namespace std;
#define PI 3.14159
//const double PI = 3.14159;
int main(int argc, char* argv[])
{ double square = ,volume =, radius=;
cout<<"请输入半径长度"<<endl;
cin>>radius;
square = 3.14159 * radius * radius;
cout<<"半径长度为:"<<radius<<"的圆面积是:"<<square<<endl;
volume = * 3.14159 * radius * radius * radius /;
cout<<"半径长度为:"<<radius<<"的球体积是:"<<volume<<endl;
}
#include <iostream>
using namespace std;
#define PI 3.14159
//const double PI = 3.14159;
int main(int argc, char* argv[])
{ double square = ,volume =, radius=;
cout<<"请输入半径长度"<<endl;
cin>>radius;
square = PI * radius * radius;
cout<<"半径长度为:"<<radius<<"的圆面积是:"<<square<<endl;
volume = * PI * radius * radius * radius /;
cout<<"半径长度为:"<<radius<<"的球体积是:"<<volume<<endl;
}
显然如果我还要求球、圆柱体的面积等,用常量的好处就显而易见,用常量的有下面一些好处:
1:增强程序的可读性。用一个有意义的常量代理一串无意义的字符串,显然很多时候程序员忘了或是不理解这一串字符串代表什么意义。
2:如果很多地方用到像PI(3.14159)这样的常量,难保输入错误,尤其复杂的很长的字符串时,而用常量则能一改而全部改变、减少出错的几率。
其中#define是定义宏变量,它其实是在编译之前,由预处理指令把代码里面的宏变量用指定的字符串替换,它不做语法检查,而constant 则是定义含有变量类型的常量。一般说来推荐使用constant定义常量,它在编译时会做语法检查。Effective c++ 的条款1中:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。而且有时候用宏,会出现意想不到的输出结果。
#define 与 const 的比较
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
(2) 有些集成化的调试工具可以对 const 常量进行调试, 但是不能对宏常量进行调试。
5.error C2057:expected constant expression
http://lylgxy0704wht.blog.163.com/blog/static/57048039200993192852623/
数组的大小可以在程序运行时定义吗?
不。在数组的定义中,数组的大小必须是编译时可知的,不能是在程序运行时才可知的。例如,假设i是一个变量,你就不能用i去定义一个数组的大小:
char array[i]; /*(notvalidc */
有些语言支持这种定义,但C语言不支持。如果C语言支持这种定义,栈就会变得更复杂,调用函数的开销就会更大,而程序的运行速度就会明显变慢。
如果数组的大小在编译时是可知的,即使它是一个非常复杂的表达式,只要它在编译时能被计算出来,你就可以定义它。
如果你要使用一个在程序运行时才知道其大小的数组,你可以说明一个指针,并且调用malloc()或calloc()函数从堆中为这个数组分配内存空间。以下是一个拷贝传给main()函数的argv数组的例子:
例 7.15 在动行时确定大小的数组,使用了指针和malloc()
/*
A silly program that copies the argv array and all the pointed-to
strings. Just for fun, it also deallocates all the copies.
*/
# include <stdlib. h>
# include <string. h>
int
main (int argc, char* * argv)
{
char* * new_argv;
int i;
/*
Since argv[0] through argv [argc] are all valid, the
program needs to allocate room for argc + 1 pointers.
*/
new_argv = (char* * ) calloc(argc + l, sizeof (char * ));
/ * or malloc ((argc +1) * sizeof (char * ) ) * /
printf ("allocated room for %d pointers starting at %P\n", argc + 1, new_argv);
/*
now copy all the strings themselves
(argv[0] through argv[argc-l])
*/
for (i = 0;i<argc; + +i)
{
/ * make room for '\0' at end, too * /
new_argv [i]= (char* ) malloc(strlen(argv[i]) + l);
strcpy(new_argv[i], argv[i]);
printf ("allocated %d bytes for new_argv[%d] at %P",
"copied\"%s\"\n",
strlen(argv[i]) + l, i, new_argv[i], new_argv[i]) ;
}
new_ argv [argc] = NULL:
/*
To deallocate everything, get rid of the strings (in any
order), then the array of pointers. If you free the array
of poiners first, you lose all reference to the copied
strings.
*/
for (i = 0;i<argc; ++i) {
free(new_argv[i]);
printf ("freed new_argv[%d] at %P\n" , i, new_argv[i]) ;
argv[i]=NULL; /* 习惯,见本例后面的注意 */
}
free(new_argv);
printf("freed new_argv itself at %P\n",new_argv);
return 0; /*请参见16.4 */
} 注意:为什么例7.5在释放了new_argv数组中的每个元素之后,还要将这些元素赋值为NULL呢?这是一种在长期实践的基础上形成的习惯。在释放了一个指针之后,你就无法再使用它原来所指向的数据了,或者说,该指针被“悬挂”起来了,它不再指向任何有用的数据。如果在释放一个指针之后立即将它赋值为NULL,那么,即使程序再次使用该指针,程序也不会出错。当然,程序可能会间接引用这个空指针,但这种错误在调试程序时就能及时被发现。此外,
程序中可能仍然有一些该指针原来的拷贝,它们仍然指向已被释放的那部分内存空间,这种情况在C程序中是很自然的。总之,尽管上述这种习惯并不能解决所有问题,但确实有作用。
C++用法总结的更多相关文章
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
- [转]thinkphp 模板显示display和assign的用法
thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...
随机推荐
- jquery完全版下载
查看演示立刻下载错误提交填加用法 jquery-2.1.1 (注!jquery-2.0以上版本不再支持IE 6/7/8) 百度引用地址 (推荐目前最稳定的,不会出现延时打不开情况) 百度压缩版引用 ...
- 【BI】资料收集
从无到有--什么是BI 什么是BI(Business Intelligence) - @我爱菊花 - 博客园 http://www.cnblogs.com/jiesin/archive/2008/06 ...
- struts2入门实例
引言: 接触.net有3.4年的时间了,一直想学习java,中间因为种种原因耽搁下来.本人学习java的目的,一是多条出路,二是和.net平台互相印证,毕竟只用一门语言,无论是在框架还是在眼界方面都会 ...
- 键盘输入,输出int数组的函数
public class function { public static void main(String[] args) { //输入数组数据(例如10个) int [] array = inPu ...
- 数组的strong copy理解
一.数组的不同情况下的copy,mutablecopy分析 1.不可变数组的copy(没有创建新对象,复制的只是指针) 2.不可变数组的mutable copy(创建新对象) ...
- Java基础-内部类介绍
java内部类介绍 内部类一共分为4种 成员内部类 静态内部类 方法内部类 匿名内部类 下面我会为大家详细介绍每一个内部类!! 成员内部类 成员内部类就好像是外部类的一个成员属性,也是内部类中最常见的 ...
- java写卷积神经网络---CupCnn简介
https://blog.csdn.net/u011913612/article/details/79253450
- Myeclipse默认编码设置
Myeclipse默认编码设置 由于编码问题的出现,我们就必须明确自己在Myeclipse所写的各种文件是按照什么格式来进行编码的.所以只有知己知彼,才能bug少出. 对于刚接触MyEclipse的不 ...
- Java Web中涉及的编解码
用户从浏览器发起一个HTTP请求,存在编码的地方是URL.Cookie.Paramiter.服务器端接收到HTTP请求后要解析HTTP协议,其中URL.Cookie和POST表单参数要解码,服务器端可 ...
- Vue 中的 v-cloak 解读
v-cloak 的作用和用法 用法: 这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Must ...