STL
文章平均质量分 66
C咖咖
历史不会简单的重复,但历史会惊人的相似
展开
-
std::set自定义排序比较函数
std::set默认是通过std::less函数来比较key值的。#include <iostream>#include <set>void main(){ std::set<int> mySet; // mySet.insert(10); // 默认比较函数为less mySet.insert(20); // 从小到大排序 for(auto it:mySet) { st原创 2020-07-10 13:21:23 · 5883 阅读 · 0 评论 -
STL之std::queue
std::queue没有提供clear的接口。我们可以如下实现:方法一直接用空的队列对象赋值queue<int> q;q = queue<int>();方法二遍历队列while (!q.empty()){ q.pop();}方法三使用swap,这种是最高效的,定义clear函数,保持STL容器的标准。void cl...原创 2019-10-30 14:23:39 · 4911 阅读 · 0 评论 -
C++ 深入理解 虚继承、多重继承和直接继承
尊重原创:http://blog.csdn.net/u013630349/article/details/47057929【摘要】本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承、虚继承与多重继承,几个交叉概念,详细的阐释了继承、虚函数与虚继承的基本概念,深入剖析了继承于虚继承的区别于联系。【Exp.001-虚继承】#i转载 2017-09-26 10:57:50 · 255 阅读 · 0 评论 -
boost::optional详解
optional:optional库使用"容器"语义,包装了"可能产生无效值"的对象,实现了"未初始化"的概念.#include using namespace boost;"无意义"的值:函数并不总能返回有效的返回值,很多时候函数可能返回"无意义"的值,这不意味着函数执行失败,而是表明函数正确执行了,但结果却不是有用的值。表示返回值无意义最常用的做法是增加一原创 2017-10-10 11:16:26 · 7091 阅读 · 0 评论 -
boost::variant and boost::apply_visitor
转自:http://www.jb51.net/article/95814.htmBoost.VariantVariant库包含一个不同于union的泛型类,用于在存储和操作来自于不同类型的对象。这个库的一个特点是支持类型安全的访问,减少了不同数据类型的类型转换代码的共同问题。Variant 库如何改进你的程序? •对用户指定的多种类型的进行类型安全的存储和取回转载 2017-11-02 15:30:52 · 1914 阅读 · 0 评论 -
c++的前置声明
一、正文定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样://a.h #include "b.h" class A { .... private: B b; };//b.h #include "a.h" class B { .... private:转载 2017-11-30 10:11:04 · 499 阅读 · 0 评论 -
C++:多维数组的动态分配(new)和释放(delete)
转自:https://www.cnblogs.com/Sylla-Zhang/archive/2012/10/08/2715300.html对于简单的一维数组动态内存分配和释放,相信大家都是知道的,不过还是举个例子吧:1 int *array1D;2 //假定数组长度为m3 //动态分配空间4 array1D = new int [m];5 //释放6 delet转载 2017-11-30 10:51:42 · 302 阅读 · 0 评论 -
设计模式的几种原则
一. 里氏代换原则定义:子类型必须能够替换它们的父类型。[DH]解释:也就是说,在软件里面,把父类都替换成子类,程序的行为没有变化。也只有这样父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。这个原则是对继承的一个约束,也就是说,继承中子类严格满足"is-a"的关系。所以,当你看到一个继承的时候,要习惯性的把他的父类和子类看成一个整体,这样会有助于你去理解转载 2017-11-30 13:45:44 · 175 阅读 · 0 评论 -
C++学习 C/C++之回调函数
在理解“回调函数”之前,首先讨论下函数指针的概念。函数指针(1)概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指针。(2)先来看一个Hello World程序:转载 2017-12-05 11:06:47 · 201 阅读 · 0 评论 -
c++14
转自:https://zh.wikipedia.org/wiki/C%2B%2B14C++14是C++的现行标准的非正式名称,正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。c++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案转载 2017-09-04 16:37:35 · 767 阅读 · 0 评论 -
c++设计模式之简单工厂模式、工厂方法模式、抽象工厂模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。 工厂模式属于创转载 2017-07-26 10:48:15 · 380 阅读 · 0 评论 -
C++中线程安全并且高效的singleton
Singleton是一个非常常用的设计模式。几乎所有稍大的程序都会用到它。所以构建一个线程安全,并且高效的singleton很重要。既然要讨论这个主题,我们就先来定义一下我们的需求:Lazy initialization。只有在第一次使用的时候才需要初始化出一个singleton对象。这使得程序不需要考虑过多顺序耦合的情况。同时也避免了启动时初始化太多不知道什么时候才会用到的东西。线程安全转载 2017-07-26 15:20:05 · 5030 阅读 · 4 评论 -
C++11 修复了DCL双重检查锁定问题
转自http://developer.51cto.com/art/201311/419604.htm双重检查锁定模式(DCLP)在无锁编程(lock-free programming)中经常被讨论,直到2004年,JAVA才提供了可靠的双重检查锁定实现。而在C++11之前,C++没有提供一种该模式的可移植的可靠实现。随着双重检查锁定模式在各语言实现上存在的缺点暴露,人们开始研究如何转载 2017-07-26 08:31:25 · 2738 阅读 · 1 评论 -
Effective c++之Item 24: 当类型转换应该用于所有参数时,声明为非成员函数
在此书的 Introduction 中我谈到让一个类支持隐式类型转换通常是一个不好的主意。当然,这条规则有一些例外,最普通的一种就是在创建数值类型时。例如,如果你设计一个用来表现有理数的类,允许从整数到有理数的隐式转换看上去并非不合理。这的确不比 C++ 的内建类型从 int 到 double 的转换更不合理(而且比 C++ 的内建类型从 double 到 int 的转换合理得多)。在这种情况原创 2017-07-18 16:24:44 · 322 阅读 · 0 评论 -
Effective C++之Item 20: 用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值)
1.引用传递提高执行效率;2.避免切断问题;缺省情况下,C++ 以传值方式将对象传入或传出函数(这是一个从 C 继承来的特性)。除非你特别指定其它方式,否则函数的参数就会以实际参数(actual argument)的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值(pass-by-value)成为一个代价不菲的操作。例如,考虑原创 2017-07-25 15:03:45 · 336 阅读 · 0 评论 -
effective c++ Item 12: 拷贝一个对象的所有组成部分
在设计良好的面向对象系统中,封装了对象内部的配件,仅留两个函数用于对象的拷贝:一般称为拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)。我们将它们统称为拷贝函数(copying functions)。Item 5 讲述了如果需要,编译器会生成拷贝函数,而且阐明了编译器生成的版本正象你所期望的:它们拷贝被拷贝对象的全部数据。原创 2017-07-18 11:34:31 · 278 阅读 · 0 评论 -
effective c++ item11在 operator= 中处理 assignment to self(自赋值)
有待详细研究:当一个 object(对象)赋值给自己的时候就发生了一次 assignment to self(自赋值):class Widget { ... };Widget w;...w = w; // assignment to self这看起来很愚蠢,但它是合法的,所以应该确信客户会这样做。另外,assignment(赋值)也并不总是那么容易辨别。例如,a[i]原创 2017-07-18 11:25:56 · 458 阅读 · 0 评论 -
Effective C++之Item 10: 让assigment operator(赋值运算符)返回一个reference to *this
三个原因让你觉得这样做是明智的:(1) 返回引用可以节省资源,不必要为返回值调用构造函数了;(2) 形如(x = y) = 3这样的连等,编译器也能接受了,因为这样的写法要求赋值运算符返回的是可以修改的左值;(3) STL和boost库中的标准代码都是这样写的,为了与它们相兼容,还是放弃你的标新立异吧关于 assignments(赋值)的原创 2017-07-25 10:16:03 · 258 阅读 · 0 评论 -
Effective c++(3th) Item9:绝不要在构造和析构期间调用虚拟函数
重要知识点记录:我以这个概述开始:你不应该在 construction(构造)或 destruction(析构)期间调用 virtual functions(虚拟函数),因为这样的调用不会如你想象那样工作,而且它们做的事情保证会让你很郁闷。如果你转为 Java 或 C# 程序员,也请你密切关注本 Item,因为在 C++ 急转弯的地方,那些语言也紧急转了一个弯。假设你有一套模拟股票交易的 cl原创 2017-07-18 11:01:53 · 211 阅读 · 0 评论 -
const关键字对C++成员函数的修饰
const对C++成员函数的修饰分为三种:1. 修饰参数;2. 修饰返回值;3. 修饰this指针。简述一下知识点如下,以后找功夫再完善。1. 对函数参数的修饰。 1)const只能用来修饰输入参数。输出型参数不能用const来修饰。 2)如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。 3)如果输入参数采用“值传递”,函数将产生临时变量(局部变量)...转载 2018-03-19 13:17:07 · 316 阅读 · 0 评论 -
C++中CONST用法总结
转自https://www.jb51.net/article/118141.htm1、修饰常量时:? 1 2 const int temp1; //temp1为常量,不可变 int const temp2; //temp2为常量,不可变 2、修饰指针时: 主要看const在*的前后,在前则指针指向的内容为常量,在后则指针...转载 2018-09-13 13:41:17 · 160 阅读 · 0 评论 -
C++ 模板模板参数
转自https://blog.csdn.net/men_wen/article/details/74033327 模板参数就是模板的参数,我们一般指定为T类型,实际上可以使用任何的名字,例如指定一个Foo的模板参数:temlate<typename Foo>Foo calc(const Foo& a, const Foo& b){ return a+...转载 2019-02-15 09:56:16 · 4133 阅读 · 1 评论 -
std::tie详解
std::tie:创建左值引用的tuple,或将 tuple 解包为独立对象返回值含左值引用的std::tuple对象。注意std::tie可用于解包std::pair,因为std::tuple拥有从 pair 的转换赋值:示例std::tie能用于引入字典序比较到结构体,或解包 tuple :#include <iostream>#i...原创 2019-10-11 14:22:14 · 26464 阅读 · 1 评论 -
std::enable_if
std::enable_if顾名思义,满足条件时类型有效。作为选择类型的小工具,其广泛的应用在 C++ 的模板元编程(meta programming)中。它的定义也异常的简单:template <bool, typename T=void>struct enable_if {};template <typename T>struct enable_if&...原创 2019-10-09 16:34:52 · 890 阅读 · 0 评论 -
C++之static关键字语法属性
1. static关键字 作用于2. static关键字声明周期3. static函数和变量4.static成员和函数和变量5.static成员变量的初始化#include <iostream> using namespace std; class A{ public: A(int a); static void print()...原创 2019-09-14 09:31:32 · 137 阅读 · 0 评论 -
C/C++ typedef用法详解
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,// 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char ...原创 2018-12-26 12:59:35 · 194 阅读 · 0 评论 -
c++ std::map value_type、key_type、mapped_type
map<string, int>::key_type v1; //stringmap<string, int>::mapped_type v2; //intmap<string, int>::value_typev3; //pair<const string, int>对于泛型编程来说,可能不知道具体类型是什么,所有就有了key_type、m...原创 2019-08-24 10:18:34 · 7225 阅读 · 1 评论 -
C++ 11 Lambda表达式
C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。声明Lambda表达式Lambda表达式完整的声...转载 2019-08-08 09:38:42 · 112 阅读 · 0 评论 -
[C++空间分配]new运算符、operator new、placement new的区别于联系
转自:https://www.cnblogs.com/stemon/p/4834585.html1. new的执行过程:(1)通过operator new申请内存(2)使用placement new调用构造函数(内置类型忽略此步)(3)返回内存指针2. new和malloc的比较:(1)new失败时会调用new_handler处理函数,malloc不会,失败时返回NU...转载 2019-04-14 11:36:05 · 317 阅读 · 0 评论 -
c++ const函数对int *p变量是顶层const
对于类中的指针类型的成员变量,在const函数中可以通过这个指针来修改所指向成员变量的值,但是不能在const函数中让该指针指向其他成员变量。也就是说,在类中,指针类型成员变量在const函数中是顶层const(顶层const表示修饰的对象本身是一个常量)。我们使用一个例子来测试:#include <iostream>using namespace std;class ...原创 2019-03-24 12:01:35 · 168 阅读 · 0 评论 -
Step By Step(C++模板目录)
这个写的不错https://www.cnblogs.com/stephen-liu74/archive/2012/09/12/2639736.html转载 2019-03-19 10:59:58 · 358 阅读 · 0 评论 -
C++指向类成员函数的指针详细解析
转自首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数。前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的。typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型int fun...转载 2019-02-14 14:10:59 · 5049 阅读 · 0 评论 -
STL map与Boost unordered_map
转自https://blog.csdn.net/orzlzro/article/details/7099231今天看到 boost::unordered_map, 它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照op...转载 2019-02-14 14:10:53 · 249 阅读 · 0 评论 -
istringstream、ostringstream、stringstream 类介绍
转自https://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html0、C++的输入输出分为三种:(1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O 1、头文件[cpp] view plaincopyprint?#include <...转载 2019-02-13 13:35:16 · 212 阅读 · 0 评论 -
C++的异常处理
转自https://blog.csdn.net/daheiantian/article/details/6530318一、什么是异常处理 一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出...转载 2019-02-13 13:32:36 · 297 阅读 · 0 评论 -
c++中指针的指针和指针的引用的使用
转自https://www.cnblogs.com/lightblueme/p/4491219.html当指针作为函数的参数进行传递时,实际上本质上是安置传递,即将指针进行了一份拷贝,在函数的内部对这个指针的修改实际上就是对一个在函数内部的那个局部变量的修改。这点事和引用不同的,引用实际上是在参数传递时,将实际变量的地址传了进去,在函数内部访问这个变量时,实际上是使用间接访问的方式来进行...转载 2019-02-13 13:28:48 · 490 阅读 · 0 评论 -
C++ explicit关键字详解
转自首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的...转载 2019-02-13 13:25:04 · 94 阅读 · 0 评论 -
函数模板的特化
转自https://blog.csdn.net/ljq32/article/details/7916723模板特化:就是在实例化模板时,对特定类型的实参进行特殊处理,即实例化一个特殊的实例版本,当以特化定义时的形参使用模板时,将调用特化版本,模板特化分为全特化和偏特化;1. 函数模板的特化,只能全特化; //泛型版本template <class T> int compa...转载 2019-02-16 11:51:16 · 465 阅读 · 0 评论 -
模板的全特化与偏特化
转自https://blog.csdn.net/thefutureisour/article/details/7964682模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。先看类模板:temp...转载 2019-02-16 09:45:51 · 128 阅读 · 0 评论 -
c++之Item7在多态基类中将析构函数声明为virtual
重点记录下:有很多方法取得时间,所以有必要建立一个 TimeKeeper base class(基类),并为不同的计时方法建立 derived classes(派生类):class TimeKeeper {public:TimeKeeper();~TimeKeeper();...};class AtomicClock: public TimeKeeper { ...原创 2017-07-18 10:39:54 · 410 阅读 · 0 评论