![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
lesliefish
不要停歇、不回头
展开
-
C++ double 转string方法 精度保持到小数点15位
1、std:to_string()方法只能精确到6位小数点 double d = 3.1415926535897932384; std::string str = std::to_string(d); std::cout << str << std::endl; // 3.1415932、使用stringstream,在输入流时使用setprec...原创 2019-06-19 13:04:29 · 28172 阅读 · 1 评论 -
std::function用法
摘自http://www.cnblogs.com/nzbbody/p/3489573.htmlstd::function我们知道,在C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor)。C++11中,新增加了一个std::function对象,std::function对象是对C++中现有的可调用实转载 2016-06-29 20:12:59 · 10310 阅读 · 0 评论 -
C++实现不可被复制的类
C++语言编程中,类的拷贝主要是通过拷贝构造函数和赋值函数来进行,再者就是为拷贝专门实现的成员方法。 由于拷贝构造函数和赋值函数在用户为提供的情况下是由C++编译器自动生成的,而且是public成员,因此默认的C++类都有拷贝功能。一个默认的C++类所拥有的成员函数:class Empty{}; //空类EmptyEmpty(); //默认构造函数Empty(const原创 2016-06-28 12:44:10 · 2767 阅读 · 0 评论 -
C++位运算详解
转自:http://www.crazycpp.com/?p=82位简介位是数据存储的最小单位。 在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。位操作详解我们先来看看位运算操作符:& (按位与)、| (按位或)、^ (按位异或)、~ (按位取反)、>> (按位右移)、<< (按位左移)。1、&(按位与) 从概念上来讲,就是将参与运算的两个分量对应的每一位来转载 2016-05-05 14:21:29 · 1076 阅读 · 0 评论 -
cbegin()和cend() -- 返回const_iterator对象
C++11开始,可以使用关键字auto代替迭代器的精确类型。 因此如果我们直接以begin()初始化迭代器,就可以使用auto声明其类型:for(auto pos = obj.begin(); pos != obj.end(); ++pos){ cout << *pos << ' ';}auto优点之一就是程序比较浓缩精简。 如果没有auto,循环内生命迭代器动作应该(举例)如下:f原创 2016-04-28 20:53:17 · 5296 阅读 · 0 评论 -
C++中explicit关键字的作用
转自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.htmlexplicitexplicit用来防止由构造函数定义的隐式转换。要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。 例如:class Things{public: Things(const st转载 2016-02-26 22:35:24 · 1581 阅读 · 0 评论 -
static_cast、const_cast用法
static_cast 用法用法static_cast < type-id > ( expression )说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。来源:为什么需要static_cast强制转换?情况1:void指针->其他类型指针情况2:改变通常的标准转换情况3:避免出现可能多种转换的歧义它主要有如下几种用法: •用于类层次原创 2016-02-25 23:34:41 · 12427 阅读 · 0 评论 -
引用作为函数返回值的好处及使用
转自:http://blog.csdn.net/zhongguoren666/article/details/8523458 对程序有所完善与修改说明: (1)以引用返回函数值,定义函数时需要在函数名前加& (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。 例如:#include <iostream>float temp; //定义全局变量tempfloat fn1(转载 2016-02-25 21:52:03 · 2894 阅读 · 0 评论 -
C++命名空间的使用实践
大型程序往往是由团队开发的,即使是个人编写的程序,随着代码量的增多,变量、函数、类的名字冲突的现象时有发生。有的情况下,编译器会指明错误所在,但有时候会发生一些察觉不到的覆盖,让程序员对出现的错误摸不着头脑。 很多厂商也提供了快捷的第3方类库,用户不用关心库中的类是如何实现的,知道如何调用接口使用即可,但多个厂商定义的变量、函数和类的名字可能会发生冲突,同样是初始化操作,甲公司类库提供了initia原创 2016-02-24 13:33:08 · 523 阅读 · 0 评论 -
代码复用 -- 组合和继承
软件复用实际上是代码的重复使用。 C语言中采用:函数 宏 C++中采用:继承 组合 某类以另一个类对象作数据成员,称为组合。在逻辑上,如果类A是类B的一部分(a part of)或者说HAS-A(“有一个”),不要从A类派生出类B,而应当采用组合的方式。 《高质量C++编程指南》中“眼睛、鼻子、嘴巴、耳朵和头部”的范例很好地解释了组合的本质:眼睛、鼻子、嘴巴、耳朵分别是头部的一部分,头部原创 2016-03-09 14:24:21 · 692 阅读 · 0 评论 -
C++类模板使用详解
来自 Oracle® Solaris Studio 12.4:C++ 用户指南类模板类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。 类模板尤其适用于描述通用但类型安全的数据结构。类模板声明类模板声明仅提供了类的名称和类的模板参数。 此类声明是不完整的类模板。 以下示例是名为 Array 类的模板声明,该类可接受任何类型作原创 2016-03-04 22:41:14 · 829 阅读 · 0 评论 -
C++模板 -- 模板隐式实例化和显式实例化
隐式模板实例化使用模板函数或模板类时需要实例。 如果这种实例还不存在,则编译器隐式实例化模板参数组合的模板。显式模板实例化编译器仅为实际使用的那些模板参数组合而隐式实例化模板。 该方法不适用于构造提供模板的库。 C++ 提供了显式实例化模板的功能,如以下示例所示。1、 模板函数的显式实例化 要显式实例化模板函数,请在 template 关键字后接函数的声明(不是定义),且函数标识符后接模板参原创 2016-03-04 20:54:19 · 1868 阅读 · 0 评论 -
cin.ignore()的使用
cin.ignore()的使用cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。 每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。 它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。 比如可以这么用:ci原创 2016-03-02 22:19:05 · 7307 阅读 · 3 评论 -
C语言产生随机数 srand rand
利用srand结合rand()实现#include<stdio.h>#include<stdlib.h>#include<time.h>#define N 20void main(){ int i; int count = 0; int number[20]; srand(time(0));/*利用系统时间来改变系统的种子值*/ while (count<原创 2016-01-15 09:38:07 · 839 阅读 · 0 评论 -
找出链表的中间结点 C语言实现
代码实现#include<stdio.h>#include<stdlib.h>#define N 50typedef struct linklist{ int data; struct linklist *next;}list, *plist;/*创建链表*/void creat_list(plist* head){ int i; plist p;原创 2016-01-13 22:31:57 · 1018 阅读 · 0 评论 -
std::move -- 强制转化为右值
在C++11中,标准库在<utility>中提供了一个有用的函数std::move,这个函数的名字具有迷惑性。 实际上std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而我们可以通过右值引用使用该值,以用于移动语义。 从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);值得一提的是,被转化的左值,其生命期并没有原创 2016-06-29 21:49:02 · 1562 阅读 · 0 评论 -
C++11新标准的阻止拷贝方案
C++11新标准下,可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数(deleted function)来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了他们,但是不能以任何形式使用他们。 通过在参数列表后面加上=delete来指出。程序: /***********************/ // @file nocopy.cc // @author lesliefish(yu原创 2016-07-02 10:19:55 · 4030 阅读 · 2 评论 -
STL之优先级队列priority_queue
priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值。 由于是个queue,所以只允许低端加入元素,并从顶端取出元素。缺省情况下priority_queue利用一个max-heap完成,后者是一个以vector表现的完全二叉树。 最大堆可以满足priority_queue所需要的“依权值高低自动递减排序”的特性。priority_queue定义:t原创 2016-07-02 21:14:33 · 1892 阅读 · 0 评论 -
现代C++之任务打包与多线程处理--使用std::packaged_task
解决的问题:多个互不相干的任务单线程处理较耗时,多线程将多任务均分后执行提高程序执行速度(类似线程池,本文更偏重于多任务的分配)。任务封装假设有任务类Task如下,每个任务初始化时传入要执行的参数,本例以传入n测试,任务执行结果以n*n表示,具体执行函数在exec()函数中执行,假设每个任务耗时100毫秒:class Task{public: Task(int n) ...原创 2019-03-05 13:14:58 · 809 阅读 · 0 评论 -
C++线程--互斥锁的风险
前言互斥锁的使用似乎非常简单。 只要保证代码中的关键部分,只能在任何时间点由单个线程访问就行了。一个互斥锁变量mt通过调用m.lock()和m.unlock()就保证了这种排他性。但是,魔鬼在于细节。。。死锁死锁的不同名字很可怕。有人称之为致命拥抱?或者死亡之吻。 但是等等,什么是死锁? 死锁是一种状态,其中至少有两个线程被阻塞,因为每个线程都在等待释放其他线程工作的某些资源...翻译 2018-07-11 23:09:38 · 827 阅读 · 0 评论 -
C++线程的创建
前言线程创建很容易,直接调用std::thread,就创建一个新线程了。该线程拿到任务后立即开始执行。 线程的创建者(父线程)必须管理创建的线程(子线程),应该等到子线程完成其任务或者让子线程从自己身上脱离。子线程可以通过复制或引用获取任务执行的参数。创建和执行线程现在,更正式的方法创建线程:一个线程获得一个Callable后立即启动它。Callable是一个行为类似于一...翻译 2018-07-11 22:34:19 · 22203 阅读 · 5 评论 -
C++ 元组 tuple的基本使用
参考原文地址:https://blog.csdn.net/chayalikemei/article/details/51105630先上tuple使用的测试程序: // 元组访问 std::tuple<int, int, vector<int>> tupleTest(1, 4, { 5,6,7,8 }); // 元组个数 ...转载 2018-03-25 23:16:56 · 13457 阅读 · 0 评论 -
C++11/14线程--线程的创建与分离
线程的创建线程的分离线程的创建让我们看看示例代码(t1.cpp).#include <iostream>#include <thread>void thread_function(){ std::cout << "thread function\n";}int main(){ std::thread t(&thread_function); // 线程 t 开始运行翻译 2017-12-17 23:07:43 · 4921 阅读 · 0 评论 -
C++11/14--线程中使用Lambda函数
多线程中使用lambda并发编程的不确定性多线程中使用lambda在本篇文章中,主要介绍lambda函数在多线程中的使用。 先从下面的例子开始吧:#include <iostream>#include <thread>int main(){ std::thread t([]() { std::cout << "thread function\n"; }翻译 2017-12-25 23:54:16 · 7784 阅读 · 2 评论 -
C++11/14线程--线程调用类对象和线程传参
线程调用类对象线程传参线程调用类对象在前面的示例中,我们为线程任务使用了通常的函数。实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子:#include <iostream>#include <thread>class MyFunctor{public: void operator()() { std::cout << "funct翻译 2017-12-18 23:32:06 · 4225 阅读 · 0 评论 -
istringstream用法
转:http://www.cppblog.com/shyli/archive/2006/10/17/13758.htmlistringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。#include<iostream>#include<sstream>using namespace std;int main(){ string str, line; wh转载 2016-07-18 22:17:56 · 487 阅读 · 0 评论 -
malloc、calloc、realloc的区别
转自:http://blog.csdn.net/shuaishuai80/article/details/6140979(1)C语言跟内存分配方式<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.<2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存转载 2016-07-05 20:17:50 · 536 阅读 · 0 评论 -
set_new_handler用法
分配内存时,如果每次new出来 ,都要判断是否成功(地址是否为空),比较繁琐。 c++提供set_new_handler,当new失败时,会调用set_new_handler设置的回调函数。 new_handler is a function pointer type taking no arguments and returning no value.实例:#include <iostream原创 2016-07-05 19:03:04 · 1277 阅读 · 0 评论 -
function call 操作符(operator()) 仿函数
过去C语言时代,欲将函数当作参数传递,唯有通过函数指针才能达成。 一个运用函数指针的例子://file: 1qort.cpp#include <cstdlib>#include <iostream>using namespace std;int fcmp(const void* elem1, const void* elem2);void main(){ int ia[10] =原创 2016-07-05 17:04:33 · 2100 阅读 · 0 评论 -
多线程内存池基本框架(C++)
为了使多个线程并发地分配和释放内存,必须在分配器方法中添加互斥锁,下面是一种多线程内存池实现的基本框架:template <class POOLTYE, class LOCK>class MTMemoryPool{public: inline void* alloc(size_t size); inline void free(void* someElement);privat原创 2016-07-04 16:13:08 · 1819 阅读 · 0 评论 -
对象大小固定的单线程内存池设计
类Rational通过重载new和delete以实现高效的内存分配,提高程序性能。 具体设计方案如下:class Rational{public: Rational(int a = 0, int b = 1) :n(a), d(b) {} void* operator new(size_t size){ return memPool->al原创 2016-07-04 14:47:02 · 540 阅读 · 0 评论 -
C/C++代码跟踪
C/C++编译器的预处理器定义了一些名字:__FILE__,__LINE__,__FUNCTION__,__DATE__,__TIME__等。 顾名思义: __FILE__:表示当前文件的文件名(含绝对路径)。 __LINE__:表示当前行号。 __FUNCTION__:表示当前函数名字(不包括返回值和实参,仅仅是函数名) __DATE__:表示预编译的日期吧转载 2016-07-03 11:05:41 · 1715 阅读 · 0 评论 -
使用C++封装互斥锁的实践
使用C++封装互斥锁的实践代码如下所示:/***********************/ // 完成互斥锁类的封装C++ // @file mutexLock.cc /***********************/#include <iostream>#include <pthread.h>#include <unistd.h>#include <assert.h>using原创 2016-03-01 16:09:18 · 1249 阅读 · 0 评论 -
C 求字符数组最大值与次大值
实现代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100void find_max(char*arr[], int size, char *max, char *second_max){ int i; for ( i = 0; i < size; i++) {原创 2016-01-10 23:27:41 · 2499 阅读 · 0 评论 -
C语言二维数组剖析【元素及元素地址的指针操作】
C语言二维数组指针操作,示例程序如下:#include #include int main(){ int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; printf("a: %d\n", a); //元素1的地址,即第一个元素地址 printf("a[1][0原创 2015-09-17 16:10:00 · 513 阅读 · 0 评论 -
C语言数组地址【元素地址及数组地址获取方法区别】
程序实例:#include #include int main(){ int a[12] = {1,2,3,4,5,6}; printf("a: %d\n", a); //数组首元素地址 printf("&a[0]: %d\n", &a[0]); //数组首元素地址另一种获取方法 printf("&a[1]: %d\n", &a[1]); //数组第二个元素的地址 pri原创 2015-09-17 11:17:38 · 11356 阅读 · 4 评论 -
C语言数组指针定义方法
数组指针是指向数组地址的指针,其本质为指针,下面程序实例是它的3种定义方法:#include #include //方法1,直接定义一个数组指针void method1(){ printf("方法1,直接定义一个数组指针\n"); int(*pMyArray)[12]; int i = 0; int myArray[12] = { 12, 11, 10, 9, 8, 7,原创 2015-09-17 14:26:47 · 2423 阅读 · 0 评论 -
C语言strstr()函数常用示例详解[求一个字符串在另一个字符串中出现的次数]
1、使用do...while 循环示例程序如下:#include #include #include int main(){ int ncount = 0; //初始化找到相同子串的次数为0 char *str1 = "khjlg666asgfsds6a666dsgdsgs666gdfgdgs666ggfdsbbn"; char str2[] = "666"; do {原创 2015-09-13 19:27:47 · 10932 阅读 · 2 评论 -
C语言const常见用法
常见示例如下:int main(){ const int a = 0.5; //#1 a须要赋初值,a不可修改(实际上可间接修改a的值,详见下方代码) int const b = 0.1; //#2 b须要赋初值,b不可修改 const char *c; //#3 *c不可被修改 c可被修改 char* const d = a; //#4 须要原创 2015-09-15 08:51:54 · 465 阅读 · 0 评论 -
C语言字符串反转实现【采用头指针和尾指针方法完成】
示例代码如下:#include #include #include void reverseStr(char *str){ int length; char *p1; char *p2; length = strlen(str); //获取字符串长度 p1 = str; //p1指向字符串首地址 p2 = str + length - 1; //原创 2015-09-14 15:16:23 · 4379 阅读 · 0 评论