![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++effective
摆渡客
记录
展开
-
memset的记录
有一个非常有趣的情况,我也没有深究其原因,在这里就写一下结论就好了,c语言里string.h里的memset(void*,int,size_t)初始化一些数组时,int的值可以是0,-1,0x3f3f3f3f,其他的值均不会和你的意,记得貌似以前看过原因,现在忘了,算了就先记下来,留着以后查吧...原创 2019-03-14 15:12:20 · 110 阅读 · 0 评论 -
一个字句切割(strtok_s)
突然想到的一件事这是,之前是用stringstream来对那些东西切割的,只是空格分隔的,之后发现不能切割其他符号的字句(也可能是我水平有限),然后我发现strtok_s可以自定义分割符,于是我记录一下这个操作。#include<iostream>#include<algorithm>#include<string>using namespace std;const int maxn = 1原创 2017-11-24 19:32:02 · 227 阅读 · 0 评论 -
typename的两个意思
effective c++条款42:了解typename的双重意义 记录下自己在看书时认为重要的东西防止忘记… 第一种是应用在template的声明式中: c++ template<class T> class b1; template<typename T> class b2; 这里的class和typename起的作用是一样的,原创 2017-11-08 19:52:42 · 4455 阅读 · 0 评论 -
Bind error: Address already in use
在写linux下的聊天室时候,出现了地址占用情况,通过ps aux |grep xxx可以发现已经强制结束的进程还存在,然后也就出现了Address already in use,通过下面代码可以解决问题int on;on = 1;ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); 现在我每次转载 2017-03-19 21:15:07 · 448 阅读 · 0 评论 -
输出语句中的星号小谈
突然想起来的一个问题,也是看书没注意的一个小问题,这样对比最有效果#include<stdio.h>int main(void){ char *p="the text is null"; printf("%.*s\n",2,p); printf("%*.*s\n",10,6,p); printf("%*s\n",20,p); printf("%*s\n",原创 2017-03-26 11:52:56 · 267 阅读 · 0 评论 -
中缀表达式转后缀并求值
这是个中缀表达式的求解,过程是先进行转换成后缀,然后我用的数组保存数,然后求解,我写的目前只限于单位数的中缀表达式…#include<iostream>#include<stack>#include<string>using namespace std;int check(char buff) { if (buff == '+' || buff == '-')return 1;原创 2017-06-27 19:59:34 · 323 阅读 · 0 评论 -
关于c的printf一些小问题技巧
突然想起来的一个问题,也是看书没注意的一个小问题,这样对比最有效果#include<stdio.h>int main(void){ char *p="the text is null"; printf("%.*s\n",2,p); printf("%*.*s\n",10,6,p); printf("%*s\n",20,p); printf("%*s\n",原创 2017-06-28 20:00:23 · 193 阅读 · 0 评论 -
单词字数统计
不成熟的代码,留给未来的自己,忘了回去再看一看,此代码含有可选泽屏蔽字#include<iostream>#include<string>#include<algorithm>#include<functional>#include<iterator>#include<set>#include<map>using namespace std;int main(void) {原创 2017-06-28 21:00:55 · 1446 阅读 · 0 评论 -
关于迭代器的相关基础操作
不成熟的代码,留给未来的自己,忘了回去再看一看#include<iostream>#include<stack>#include<vector>#include<string>#include<list>#include<algorithm>#include<functional>#include<iterator>//包含流迭代器#include<map>using namesp原创 2017-06-28 20:02:23 · 177 阅读 · 0 评论 -
类型别名的一些问题
这是primer上的一个问题,pstring是char*的别名,书上的解释是: 上述两条声明语句的基本数据类型都是const pstring,const是对给定类型的修饰,pstring实际是指向char的指针,因此,const pstring 就是指向char的常量指针,而非指向常量字符的指针。typedef char *pstring;const pstring cstr = 0;原创 2017-07-02 16:47:00 · 197 阅读 · 0 评论 -
一个具有对象计数功能的基类
源自more effective c++ item M26:目的:为了做到一个类具有对类对象数量限制功能及不再派生新的子类;做法是继承一个计数功能的基类,并将自身构造私有化。过程是Printer在进行构造的时候,会先进行基类的构造,在构造时会调用init()函数,函数会判定是否已经到达限制,若到达限制就进行throw,否则就继续进行构造。代码:#include<iostream>#include<原创 2017-12-21 15:36:15 · 273 阅读 · 0 评论 -
关于getline和getchar的小点
这也是在看题的时候发现的,先贴上代码:#include<iostream> #include<string.h>#include<string>using namespace std;int main(void){ string str; int n; cin >> n; getchar(); while (n--) { getline(ci原创 2017-12-13 21:50:11 · 635 阅读 · 0 评论 -
profiler 的介绍
因为之前没接触过项目也就对项目优化无从谈起,就原文摘录一下侯老师的原话吧:结果是用经验猜测程序那 20%的部分只会导致你心痛。正确的方法是用 profiler 程序 识别出令人讨厌的程序的 20%部分。不是所有的工作都让 profiler 去做。你想让它去直接 地测量你感兴趣的资源。例如如果程序太缓慢,你想让 profiler 告诉你程序的各个部分都 耗费了多少时间。然后你关注那些局部效率能够翻译 2017-12-15 14:41:10 · 1278 阅读 · 0 评论 -
引用计数(二)
这次的版本是上格版本的优化和加强,大体思路是,在一个String类里嵌套一个类,让StringValue对内存进行操作,具体为开辟空间,delete。然后让String继承自RCObject,RCObject的功能是计数,标记各个对象是否该删除,是否可share,然后再是RCPtr,这个smart pointer用来具体操作引用计数的各种操作,包括对String的赋值和析构操作。#includ原创 2018-01-10 19:11:53 · 227 阅读 · 0 评论 -
让函数根据一个以上的对象类型来决定如何虚化
本部分的代码来自于more effective Item 31,部分代码是我改的(很少) 一开始看见这个主题有点懵,没搞懂意思。看了书里的例子后发现这确实是一个很重要的问题class GameObject{...};class SpaceShip:public GameObject{...};class SpaceStation:public GameObject{...};cla原创 2018-01-16 09:34:53 · 226 阅读 · 0 评论 -
隐式转换(一)
考虑:class Array{public: Array(int size); ... T &operator[](int index);}; bool operator==(const Array &lh,const Array &rh); int main(){ Array a(5); Array b(5); if(a==b[0]){.原创 2018-01-04 09:44:09 · 322 阅读 · 0 评论 -
引用计数(一)
大体意思就是通过一个标记记录赋值的次数,在析构里将标记递减,如果是标记为0,说明没有对象在共享这块内存,所以可以调用delete释放内存了。#include#include#include#includeusing namespace std;class String{public: String(const char *str=""); String (c原创 2018-01-05 11:52:32 · 285 阅读 · 0 评论 -
void* pointer
在学习内存管理一块内容的时候经常看见内存分配的函数的类型是void *,可以理解为一种泛型,可以接受任何类型的指针,也可以转换为其他类型的指针。指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型;编译器根据指针的类型从指针指向的地址向后寻址,指针类型不同则寻址范围也不同,比如:int*从指定地址向后寻找4字节作为变量的存储单元double*从指定地址向后寻找8字转载 2018-01-02 10:56:19 · 858 阅读 · 1 评论 -
operator运算符的重载问题
从侯捷老师的书上看到,如果重载运算符作为成员函数在类内定义的话,会出现一些问题,比如在类内定义了: T operator+(const T &)const 由于是类内的成员函数,使用时:T t1(10) ; t1=t1+3 ; 这种使用不会出现问题,调用等效于t1.operator+(3),至于原因,我只说一下结论,当参数被列与参数列内,这个参数才是隐式类型转换的合格参与者。类会为2建立一个临时T对原创 2017-09-26 21:56:58 · 514 阅读 · 0 评论 -
临时对象的来源
more effective c++ Item M19:理解临时对象的来源由于这一篇是比较短的,而且说的很好,我觉得没必要进行总结,因为原文已总结的很精简了,所以就翻过来:当程序员之间进行交谈时,他们经常把仅仅需要一小段时间的变量称为临时变量。例如 在下面这段 swap(交换)例程里:template<class T>void swap(T& object1, T& object2){ T翻译 2017-12-15 15:04:02 · 472 阅读 · 0 评论 -
性能-lazy evaluation(惰性计算法)
http://blog.csdn.net/qianqin_2014/article/details/51330339原创 2017-12-15 14:57:21 · 1200 阅读 · 0 评论 -
list相关操作
借以熟悉顺序容器的相关操作,以及lambda的用法 list<int>arr; int i=0; while(i<10) arr.push_back(i++); auto beg=arr.begin(); while(beg!=arr.end()){ if(*beg%2){ beg=arr.in原创 2017-07-27 13:22:22 · 134 阅读 · 0 评论 -
限定条件的容器数组排序输出
使用的vector容器,其中涉及iostream迭代器以及bind函数的相关用法#include<iostream>#include<utility>#include<vector>#include<algorithm>#include<functional>#include<iterator>using namespace std;using namespace std::place原创 2017-07-27 13:35:01 · 181 阅读 · 0 评论 -
关联容器map
每一个map的对象是pair类型,pair含有first和second对象用以访问pair的key与value#include<iostream>#include<map>#include<string>using namespace std;int main(void) { map<string, int>_map; string a; int b; while (原创 2017-07-27 13:41:54 · 200 阅读 · 0 评论 -
不要重新定义继承而来的缺省参数值
effective c++条款37:绝不重新定义继承而来的缺省参数值 由于non-virtual函数应该绝对不被derived classes覆写,这个设定使得base中的non-virtual函数的缺省参数值不会变化,缺省参数值是静态绑定,意思是“调用一个定义与derived class内的virtual函数”的同时,却是用base class为他所制定的缺省参数值,一下为代码示例(自己写的比较原创 2017-11-07 17:28:45 · 292 阅读 · 0 评论 -
通过复合塑膜出has-a或“根据某物实现出”
effective c++条款38:通过复合塑膜出has-a或“根据某物实现出” 复合(composition)是类型之间的一种关系,当某种类型的对象内含他种类型的对象,便是这种关系,例如:class Address{...};class PhoneNumber{...};class Person{public:private: std::string name; Addr原创 2017-11-07 17:42:11 · 189 阅读 · 0 评论 -
c++模板深度理解
如何组织编写模板程序 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统转载 2017-11-12 16:17:55 · 225 阅读 · 0 评论 -
虚函数的多态实现小解
要做批注的只有一点,虚表在这几个类中是共享的,并不是每一个类都生成一份自己的虚表。解析是,子类中覆盖的父类中的虚函数,在虚表中是替代了父类那个虚函数的位置,根据向上规则,就实现了多态。#include<iostream>using namespace std;class base {public: virtual void print() { cout << "base翻译 2017-11-12 17:10:53 · 186 阅读 · 0 评论 -
透彻理解c++模板包含模型(转)
原文的地址是:http://blog.csdn.net/ixsea/article/details/6695496 观点 包含模型是C++模板源代码的一种组织方式,它鼓励将模板代码全部放在一个.h头文件中,这样可以避免莫名其妙的链接错误。 莫名其妙的链接错误 一般而言,程序员习惯将函数和类的声明放在.h文件、把它们的实现放在.cpp文件,这种多文件组织方式一直被倡导。一方面,这种分离使得代码转载 2017-11-12 20:35:21 · 643 阅读 · 0 评论 -
指针数组与数组指针
文章转自:https://www.cnblogs.com/mq0036/p/3382732.html 数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a转载 2017-11-15 22:42:05 · 129 阅读 · 0 评论 -
不要对数组进行多态
这是effective上的一条,当初我的理解并没有错,这个操作会造成指针访问数组的偏移发生变化,导致无法正常访问,只有一种情况是不会出错,那就是父类和派生类的大小相等,这样偏移量也就相等。再说一下我的想法吧,我天真的认为一个virtual 函数可以解决这个问题的,事实证明我的想法是真的可笑,但这次的尝试让我在大佬的教导下对多态和类有了新的认知。 话不多说贴上代码:#include<iostream原创 2017-11-16 20:04:31 · 466 阅读 · 0 评论 -
priority_queue用法
在STL里有这个priority_queue,实现优先队列的结构。在优先队列中,优先级高的元素先出队列。 现在在这里说说用法吧 先看看语法: Syntax: In their implementation in the C++ Standard Template Library, priority queues take three template parameters:1 2 temp转载 2017-11-30 21:48:21 · 180 阅读 · 0 评论 -
抛出异常的特点
more effective 条款12:了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异。 在此记录一下学习笔记: 主要有3个差异:1.exception objects总是会被复制,如果以by value 方式捕捉,他们甚至会被复制两次,至于传递给函数参数的对象则不一定的复制2.“被抛出成exception”的对象,则被允许的类型转换动作比“传递到函数去”的对原创 2017-11-17 22:24:06 · 413 阅读 · 0 评论 -
可变模板参数“...”
这是我转载的一篇并且只转了一部分,源网址是:http://www.cnblogs.com/qicosmos/p/4325949.html 1概述 C++11的新特性–可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑转载 2017-11-05 17:47:48 · 514 阅读 · 0 评论 -
完美转发std::forward与auto/decltype的一些小知识
是在标准头文件的一个函数用于泛型编程时实现完美转发,可以把函数的参数原封不动的转发给其他函数。声明是:template<class T>T&& forward(T& t)noexcept;template<class T>T&& forward(T&& t)noexcept;forward()在使用时必须指定模板,他应用了c++11/14标准的引用折叠规则,对于任何类型的参数(值类型,引用类型,常原创 2017-11-05 15:54:56 · 753 阅读 · 0 评论 -
成员函数后的const
const的其他情况不在赘述,我说的这个是只能用于修饰成员函数,用处是向编译器声明用户不会更改传入变量,要注意的是一种情况,就是当类内有两个重名的函数,比如:void T:: print(const int&)const ; void T:: print(const int&) ; 这两个成员函数是不同的,因为第一个函数的签名是print(const int&)const, 第二个是print(co原创 2017-09-27 19:32:08 · 187 阅读 · 0 评论 -
拷贝构造函数的相关
拷贝构造函数参数应该为引用,拷贝构造函数的参数使用引用类型不是为了减少一次内存拷贝, 而是避免拷贝构造函数无限制的递归下去。#include<iostream>using namespace std;class A {private: int value;public: A(int n) { value = n; cout << value;原创 2017-07-27 13:52:52 · 161 阅读 · 0 评论 -
拷贝构造函数调用的情况
1当用类的一个对象初始化该类的另一个对象时.例如:int main(){ point A(1,2); point B(A);//用对象A初始化对象B,拷贝构造函数被调用.}2 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时. void f(point p){}main(){ point A(1,2); f(A);//函数的形参为类的对象时,当调用函数时原创 2017-07-30 17:00:48 · 227 阅读 · 0 评论 -
动态绑定与静态绑定的小结(改)
接下来的一段话是我从一位博客大佬那里copy来的:对象的静态类型:对象在声明时采用的类型。是在编译期确定的。对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。在此贴上大原创 2017-08-05 18:07:36 · 533 阅读 · 1 评论 -
虚析构函数的小结
如果我们的类存在派生,应该在顶端类中定义虚析构函数,如果基类的析构函数不是一个虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为,会造成内存泄漏。虚函数依赖虚函数表进行工作。如果一个类中,有函数被关键词virtual进行修饰, 那么一个虚函数表就会被构建起来保存这个类中虚函数的地址。同时, 编译器会为这个类添加一个隐藏指针指向虚函数表。如果在派生类中没有重写虚函数, 那么,派生类中原创 2017-08-05 21:42:17 · 252 阅读 · 0 评论