C++
一个程序渣渣的小后院
这个作者很懒,什么都没留下…
展开
-
C++Primer 中文版第5版 习题3.4
#include #include using namespace std;int main(){string str_one, str_two;cin >> str_one >>str_two;if (str_one == str_two){cout }else{cout str_two ? str_one : str_two)原创 2016-09-14 23:31:20 · 348 阅读 · 0 评论 -
C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测
class myClass{public: myClass() {} double func(double n) { return n; }private: int func(int n) { return n; }};int main(){ myClass mc; mc.func(7); //报错 return 0;}程序在编译的过程原创 2017-07-09 23:27:04 · 942 阅读 · 0 评论 -
C++学习笔记-----输出数据的另一种写法(std::copy)
输出的数据的另一种写法#include <iterator>vector<int> v{1, 2, 3, ...};copy(v.begin(), v.end(), ostream_iterator(cout, "\n"));endl在进行换行的同时会清空缓冲区,而”\n”则不会这样,倘若不需要实时输出缓冲区中的内容,用”\n”会快许多。for(int i = 0; i < v.size(); +原创 2017-07-09 23:14:58 · 423 阅读 · 0 评论 -
C++学习笔记-----std::pair作为unordered_map的key
pair作为unordered_map的key需要为pair添加hash函数class ListNode;struct pair_hash{ template<class T1, class T2> std::size_t operator() (const std::pair<T1, T2>& p) const { auto h1 = std::hash<原创 2017-07-31 23:06:56 · 10716 阅读 · 1 评论 -
C++学习笔记-----std::string的=,+,+=对int,char类型操作数的支持
C++中提供了封装的字符数组std::string,同时提供了多种方便的运算操作。调用构造函数时的=运算符不支持int,char类型的操作数 string str1 = 'a'; //error string str2 = toupper('a'); //error错误信息:不存在从char(int)转换到std::string的适当构造函数调用赋值运算函数时的=运算符支持int,原创 2017-07-31 23:34:20 · 2567 阅读 · 0 评论 -
一个整数数组,每个数字都出现K次,只有一个数字出现M次,找出这个数字(线性时间)
原题链接https://leetcode.com/problems/single-number-ii/description/ 这类题都是形如给定一个整型数组,数组中每一个数字都出现了K次,只有一个数字出现M次,其中M 首先考虑K = 2,M = 1的情况,可以使用XOR异或运算便利一边数组元素,最后异或的结果就是只出现一次的数。因为异或运算具有如下性质:A ^ A = 0;A ^原创 2017-08-01 00:47:17 · 1630 阅读 · 0 评论 -
C++学习笔记-----二分法之寻找非减序列第一个大于某个值的数或最后一个小于某个值的数
二分法在对有序序列的处理上可以达到O(lg(n))的时间复杂度,通常用在二分查找上。此时有一个有序序列,给定一个数n,n可以在这个序列中也可以不在,要求找到第一个大于n的数和第一个小于n的数。实际上,只需要在二分法的基础上稍加改动即可达到需求二分查找n的下标int binaryFind(vector<int>& nums, int n){ int left = 0; int rig原创 2017-08-05 19:20:39 · 4390 阅读 · 2 评论 -
C++学习笔记-----用位运算实现加减乘除
数据在计算机内存中是以二进制存储的。 几种常用的位运算:与运算&: 对应位均为1时为1,其它为0。或运算|: 对应位均为0时为0,其它为1。异或运算^: 对应位不相同时为1,相同时为0.按位取反~: 每一位取反右移>>: 将二进制进行右移,低位丢掉,高位补零。左移加法以0111 + 0101为例,观察异或运算和与运算的结果原创 2017-06-07 23:11:44 · 11837 阅读 · 2 评论 -
C++11学习笔记-----获取异步操作执行结果
在多线程环境中,不管是传递lambda还是传递函数指针,再或者是传递函数对象给std::thread,都很难获取执行函数返回值。在以前,只能将结果以引用的形式作为线程函数参数的一部分以此保存返回值,但是仍然存在很大局限性,甚至不太美观。C++11引入的std::future可以有效解决这一问题。std::future定义在头文件<future>中,提供了一种获取异步操作返回值的...原创 2018-02-08 19:40:11 · 3592 阅读 · 1 评论 -
C++11学习笔记-----线程库std::thread
在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的。但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美C++11在语言级别上提供了线程的支持,不考虑性能的情况下可以完全代替操作系统的线程库,而且使用起来非常方便,为开发程序提供了很大的便利Linux下的原生线程库pthread库函数创建线程采用pthread_creat原创 2018-02-07 00:40:51 · 10436 阅读 · 2 评论 -
C++11学习笔记-----互斥量以及条件变量的使用
在多线程环境中,当多个线程同时访问共享资源时,由于操作系统CPU调度的缘故,经常会出现一个线程执行到一半突然切换到另一个线程的情况。以多个线程同时对一个共享变量做加法运算为例,自增的汇编指令大致如下,先将变量值存放在某个寄存器中(eax),然后对寄存器进行加一,随后将结果回写到变量内存上mov [#address#] eax; // 这里#address#简要表示目标变量的地址原创 2018-02-07 19:31:02 · 1677 阅读 · 0 评论 -
C++代码片段(一)萃取函数返回值类型,参数类型,参数个数
函数的类型主要集中在以下几种函数指针函数对象,是一个类对象,内部重载的operator()函数是一个函数指针lambda,匿名函数对象,同函数对象function对象 后三者都是类对象,可以看成一种类型定义基础模板类template &lt;typename T&gt;struct function_traits;针对函数指针进行模板特化对...原创 2018-05-26 15:27:49 · 3542 阅读 · 0 评论 -
C++代码片段(二)判断可变模板参数中是否包含某一特定类型
首先定义基础模板类,表示不包含给定类型template &amp;lt;typename T, typename... Args&amp;gt;struct contains : public std::false_type {};接着进行特化,将可变模板参数中的类型逐个和目标类型进行比较,直到类型相同或者模板参数列表为空template &amp;lt;typename T, typename U...原创 2018-05-26 17:26:43 · 4050 阅读 · 0 评论 -
C++代码片段(四)萃取模板类的模板参数类型
例如有类型Test<int, double, std::string>可以萃取出模板参数分别是int, double, std::string方法如下#include <tuple>#include <iostream>template <typename...>struct template_argument...原创 2018-06-03 18:51:37 · 820 阅读 · 0 评论 -
C++代码片段(三)过滤可变模板参数中某些类型的变量
将可变模板参数列表中的某些类型过滤掉,然后返回剩下数据的元组。用到了上一篇中的判断可变模板参数中是否包含某一特定类型的方法#include <iostream>#include <tuple>#include <string>#include <vector>#include <list>template <ty...原创 2018-05-29 19:06:35 · 731 阅读 · 0 评论 -
wchar_t*和string相互转换
在处理中文时,一个中文通常占用2个字节,而char*和string字符串中的字符都是一个字节的,为了能够有效处理中文,引入了wchar_t*型变量,当需要处理中文时,可以首先将string转换成char*,然后将char*转换成wchar_t*即可。在window环境中,可以利用MultiByteToWideChar();WideCharToMultiByte();两个API函数来实原创 2017-05-24 13:04:10 · 19551 阅读 · 3 评论 -
学习笔记-----关于C++中类的成员函数可以访问私有成员的问题
直接上代码吧templateclass vectorList : public linearList{public:vectorList(size_t initCapacity = 10);vectorList(const vectorList & rhs);~vectorList();......protected:void checkInde原创 2016-10-15 10:14:35 · 2117 阅读 · 0 评论 -
C++Primer 中文版第5版 习题3.23
#include #include using namespace std;int main(){vector vec;for (size_t i = 0; i != 10; i++){vec.push_back(i);}for (vector::iterator it = vec.begin(); it != vec.end();原创 2016-09-18 23:48:40 · 274 阅读 · 0 评论 -
C++Primer 中文版第5版 习题3.26
二分搜索的新中间点的计算公式:mid = beg + (end - beg) / 2 而不是 mid = (beg + end) / 2 ?为了防止在最后的两个数字之中进行查找,不如beg = 6 and end = 7, 用当此时的beg不符合要求时新计算的mid = 7, 而第二种结果是6 这会造成无法更新中间点,永远都找不到结果。原创 2016-09-20 18:45:42 · 574 阅读 · 0 评论 -
C++Primer 中文版第5版 习题3.31/3.32
#include #include using namespace std;int main(){int num[10];int num_cpy[10];for (size_t i = 0; i != 10; ++i){num[i] = i;}for (size_t i = 0; i != 10; ++i){num_cpy[i]原创 2016-09-20 18:55:29 · 437 阅读 · 0 评论 -
学习笔记-----关于VS中使用模板类出现无法解析的外部符号问题
最近再学数据结构,刚接触线性表,用VS2015照着书把linearList的array描述补全了结果运行总提示:无法解析的外部符号翻了几篇博客发现貌似是和C++编译的机制有关(底层机制不是很懂,(-__-)b)要想解决,可以把类的声明和定义放在同一个(.h)文件中,这样编译器在编译的时候可以直接捕获到类的所有内容。记一次教训吧感觉C++还得下功夫学。原创 2016-10-14 00:38:39 · 2984 阅读 · 0 评论 -
学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案
今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题。大致代码如下templateclass chainList : public linearList{ friend ostream& operator & rhs);public: ......private: ......};//友元函数实现的实现template原创 2016-10-18 21:25:51 · 3578 阅读 · 2 评论 -
C++模板类的虚函数成员
C++模板类只有在被使用的时候才会被特化,同样其成员函数也是在被使用的时候才被实例化。但是虚函数成员例外,原因应该是在定义一个模板类类型的变量时(使用模板类),为了确定虚函数表的大小,就已经实例化了虚函数成员。(个人理解,有错见谅)有关虚函数表:关于虚函数,其主要目的是为了实现多态,也就是用基类的指针来调用其派生类的函数。所以在派生类的地址前段会存在虚成员函数地址,这个位置被称为虚原创 2016-11-11 10:06:26 · 3665 阅读 · 0 评论 -
C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别
1.在同一个作用域中定义的同名不同参的一些为重载。2.若在基类中定义了某一non_virtual函数,在派生类重存在同名函数(不需要参数列表相同),基类的该函数在派生类中是不可见的,如若用派生类的实例化对象调用基类的该函数会编译错误。此种情况即为隐藏,指基类的函数在派生类中隐藏了,编译器找不到这个函数。3.覆盖,指的就是继承体系中virtual函数作用域。如果基类中的某一函数被声明为虚函数原创 2016-12-20 18:24:49 · 297 阅读 · 0 评论 -
C++学习笔记-----operator=函数处理自赋值
很多时候我们需要对类使用赋值运算符operator=函数来将一个类赋值给令一个类,但是如果类的成员变量中存在指针类型的变量,而且这个指针的内存是从heap内存中申请的时候,在实现赋值运算符函数的时候要处理自赋值的情况,即a = a的情况,举个例子:class Widget{public: Widget() : p(new int) {} Widget(int a) : p(new in原创 2016-12-21 22:05:39 · 610 阅读 · 0 评论 -
C++学习笔记-----不要在构造函数和析构函数中调用虚函数
考虑下面的程序:#include using namespace std;class Base{public: Base() { cout << "Base Construct" << endl; func(); } ~Base() { cout << "Base Destroy" << endl; } void toG() { g(); } virtual void fu原创 2016-12-22 10:37:28 · 422 阅读 · 0 评论 -
C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数
类的拷贝构造函数与赋值运算不同,拷贝构造函数是对这个类进行初始化的过程,而赋值是删除原有的东西,赋予它新的东西。但是二者在实现上是互通的。templategraphChain::graphChain(const graphChain& theChain){ ...//实现拷贝}templateconst graphChain& graphChain::operator=(co原创 2016-12-27 00:20:03 · 506 阅读 · 0 评论 -
C++学习笔记-----在一个构造函数中调用另一个构造函数
在构造函数中调用另一个构造函数如果一不注意就会有无限递归的危险,而且构造函数的参数的不同也决定了调用的不同,所以特意总结了一下哪些形式的调用时允许的:首先假设构造函数调用时参数都是外部的变量,而不是一个常量。第一种,也是C++11支持的一种调用方式。在函数的初始化列表中调用另一个构造函数:int b = 2;class Test{public: Test() : Test(b)原创 2016-12-27 00:37:17 · 15232 阅读 · 2 评论 -
C++类成员函数在.cpp中设置成inline后无法解析的问题
内联函数:告知编译器在进行有内联标识的函数调用时将函数体部分在调用处展开。这样做可以消除函数传参(堆栈调用)的负担,提高了函数的调用效率。而且inlining的函数并不存在,因为已经被展开了。如果需要定义一个内联函数,需要在函数体定义的地方使用inline关键字标识,写在函数声明处是没有意义的。如int func(int); //函数声明inline int func(原创 2016-12-20 10:50:34 · 3288 阅读 · 1 评论 -
C++学习笔记-----存在多态调用时,为基类定义虚析构函数
在C++的继承体系中,构造函数和析构函数的执行顺序是完全相反的。对于构造函数:从继承体系的最顶层的基类开始,一步步往下构建。即构造顺序是 基类--->>派生类。对于析构函数:从继承体系的最底层的派生类开始,一步步向上析构。即析构顺序是 派生类-->>基类。这些对于类的实例化对象来说完全正确,但是如果在程序中存有多态指针,即基类指针指向派生类的时候,需要我们为基类提供一个虚析构函数。原创 2016-12-20 11:23:27 · 388 阅读 · 0 评论 -
C++学习笔记-----永远不要在派生类中改变虚函数的默认参数值
提到虚函数,我们就会自然而然的想到多态,但是当虚函数中存有默认参数值的时候,在派生类中重定义这个虚函数时不可以改变这个参数的值。请看下面的例子:#include "stdafx.h"#include using namespace std;class Base{public: Base() { std::cout << "Base Constructor" << std:原创 2016-12-20 19:57:23 · 1845 阅读 · 2 评论 -
C++代码片段(五)tuple的实现
元组tuple是多类型的集合,可以当做升级版的pair来用。因为tuple可以保存多个任意类型的值,导致不能够在一个类里面保存所有的数据,所以采用每一层保存一个数据的方法实现实现tupletemplate &lt;typename... Args&gt;class tuple{};/* 每一层保存一个T类型的数据 */template &lt;typename T,...原创 2018-06-08 23:18:31 · 2072 阅读 · 0 评论