C++
dreamiond
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
编程陷阱——浮点数舍入
在《算法竞赛入门经典(第二版)》(紫书)的第二章,最后有一道思考题:下面的程序运行结果是什么?提示:请上级实验,不要凭主观感觉回答。#include<stdio.h>int main() { double i; for (i = 0; i != 10; i += 0.1) printf("%.1f\n", i); return 0;}实验发现程序会无限循环执行下去...原创 2018-11-25 15:59:29 · 528 阅读 · 0 评论 -
C++——以任意数为底的对数
C++内置对数函数只有以e为底和以10为底的,如果想要以m为底的对数可以借助如下公式:loga(n)/loga(m) = logm(n)即:double res = log(n)/log(m); //res = logm(n)原创 2018-11-26 10:30:49 · 8146 阅读 · 0 评论 -
C++——自定义map的value默认值
在使用map的[]操作符对其进行访问时,如果map中尚没有查询的key值,则将创建一个新的键值对。其key值为查询的值,value值分为以下两种情况:value为内置类型时,其值将被初始化为0value为自定义数据结构时,如果定义了默认值则初始化为默认值,否则初始化为0使用第二种方法自定义map的value默认值例如:map的value为int类型,key值也为value类型,想要将...原创 2018-11-15 11:37:04 · 15262 阅读 · 3 评论 -
C++——顺序容器的emplace操作
C++11新标准引入了三个新成员——emplace_front、emplace和emplace_back,对应于push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定位置或容器尾部。这两种操作的主要区别在于:emplace构造而不是拷贝元素。也就是说:当调用push或insert成员函数时,我们将元素类型的对象传递给他们,这些对象被拷贝到容器中(创建...原创 2018-11-21 13:24:32 · 950 阅读 · 0 评论 -
C++——使用仿函数实现map的降序排序
自定义关键字比较操作对于有序容器(map multimap set multiset等),关键字类型必须定义元素比较的方法。默认情况下,标准库使用关键字类型的<运算符来比较两个关键字。也就是说,默认的map是按照关键字升序排列的。如果想要使map按照关键字降序排列,需要提供自己定义的操作来代替关键字上的<运算符。使用仿函数在头文件xfunctional里有两个仿函数greater...原创 2018-11-14 22:45:34 · 1665 阅读 · 0 评论 -
C++——将map作为形参传递时,能使用常量引用吗?
void test(const unordered_map<int,int> &um){ if(um[1]){ //一段测试代码 }}上述代码将不能通过编译。原因:map的[]运算符会在索引项不存在的时候自动创建一个对象,而常量不能改变。解决办法:使用迭代器替换即可,如下例所示。void test(const unordered_map&l...原创 2018-10-25 13:42:33 · 7176 阅读 · 0 评论 -
C++——“非常量引用的初始值必须为左值”问题
参考:http://blog.sina.com.cn/s/blog_6d6f47690101dgwi.html首先,先看下面一个例子:int main(){int i =2;double &r =i;return 0;}报错:gcc error: invalid initialization of reference of type ‘double&’ from expression of转载 2017-09-20 20:56:53 · 1798 阅读 · 0 评论 -
基础语法——A&&B与B&&A有什么区别?
举例看下面一段代码:for ( j=100; j>=0 && v[j]>key; j--) { ;//do something }运行没有问题。 但是假如我把这段代码这么写://注意&&前后的表达式调换了位置for ( j=100; v[j]>key && j>=0 ; j--) { ;//do something }这个时候运行就出了问题! 原因是在C++中,原创 2017-09-08 16:08:01 · 5036 阅读 · 1 评论 -
C++——new和delete之后发生了什么?
众所周知,如果我们使用new向系统申请了内存,我们应该使用指针指向这一块内存,俾能我们使用结束后,通过delete该指针释放此内存资源。如果理解只达到这种程度,在内存管理稍微复杂一点时便一定会束手无策。总有一些事情比其他事情更基本一点,现在我来谈谈当我们new和delete之后到底发生了什么。C++中的五种内存在C++中内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。堆区:用户使原创 2017-07-16 14:19:53 · 5151 阅读 · 4 评论 -
C++——使用变量作为数组长度
C++中一般是不能使用变量作为一个数组的长度的,必须使用常量。 这是因为数组作为C++的内置数据类型,其空间分配在栈内存中,这部分空间的大小在编译时就要确定,不能等到运行时再分配。常量的值在编译时就能得到,而变量的值在运行时才能确定。 但是仍然有办法使用变量作为数组的长度:绕过栈内存,将数组空间开辟在堆空间内:int *d = new int[n];这样这块内存就是自己开辟的了,可以使用变量初始原创 2017-06-13 15:17:14 · 37227 阅读 · 7 评论 -
C++——cast强制类型转换
以前学习的时候,使用的都是旧式版本的强制类型转换,就是int(a)/a(int)这种。最近在看effective C++的时候注意到了新的cast强制类型转换,在这里整理一下。 一个命名的强制类型转换具有如下形式: cast-name<type>(expression); 其中type是转换的目标类型,expression是要转换的值,cast_name是static_cast、dy原创 2017-06-12 08:53:36 · 836 阅读 · 0 评论 -
C++——unordered_set默认无法哈希vector?
有如下代码:unordered_set<vector<int>> dict;上述代码在编译时会报错:错误 C2338 The C++ Standard doesn't provide a hash for this type.原因如下:unordered_set和unordered_map本质上都是使用hash方法对元素进行存储和查...原创 2019-03-14 15:10:10 · 11727 阅读 · 5 评论
分享