Java容器总结 ListArrayList底层为动态数组,因为它的增加、删除元素与size的变化不是原子操作,所以不是线程安全的LinkedList底层为双向链表,实现了List接口和Deque接口。不是线程安全的Vector创建了一个向量类的对象后,可以往其中随意插入不同类的对象。线程安全的,synchronized。替代方案:Collections.synchronizedList()MapH...
shell工具 shell 工具sortuniqpastecutxargsgrepsed基本命令高级命令特殊符号选项awkBEGIN 和 ENDawk脚本find常见选项其它重要工具freedfiostatnetstattoparprouteshell 工具sortsort将文件的每一行作为一个单位,相互比较,比较...
C++运算符重载的三个为什么 C++运算符重载的三个为什么1. 为什么有四个操作符不宜重载为友元函数?2. 为什么流操作符必须重载为友元函数?3. 为什么有五个操作符不能重载?C++运算符重载的三个为什么1. 为什么有四个操作符不宜重载为友元函数? 四个不能宜载为友元函数的运算符为:=、()、[]、->我在网上搜了许多博客,很多人都说是: 当把赋值运算符重载为类的友员...
C++之lambda C++之lambda什么是lambda表达式?lambda表达式语法捕捉列表?参数列表?lambda表达式的作用C++之lambda什么是lambda表达式?一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个匿名的内联函数。lambda表达式跟普通函数相比不需要定义函数名,取而代之的多了一对方括号[]。lambda表达式...
C++之智能指针 C++之智能指针auto_ptrunique_ptrshared_ptrweek_ptrC++之智能指针智能指针的核心思想:资源分配即初始化:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放C++标准库里主要有四种指针:auto_ptr、unique_ptr(scope_ptr)、s...
C++之类型萃取 C++之类型萃取在C++中想要获得某个变量的类型有两种方式: 一种是利用typeid。 ypeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。 用法:typeid().name()#include <iostream>using namespace std;class Bas...
C++之类模板特化 C++之类模板特化模板:template<typename T1, typename T2>class example{public: example(); ~example();private: T1 data1; T2 data2; int data3;};template<typename T1, typena...
C++关键字之virtual C++关键字之virtual1. 虚基类在C++之继承的多重继承引起的二义性问题中讲到,解决二义性问题的另一个方法就是用关键字virtual。具体做法就是虚基类。1.1 声明虚基类虚基类的声明并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。声明时只需在派生类指定继承方式前面加上关键字virtual即可。class A{int a};clas...
C++之继承 C++之继承1 公有继承2 私有继承3 保护继承4 派生类的构造函数与析构函数4.1 派生类的构造函数4.2 派生类构造函数的特殊形式4.3 派生类的析构函数5 多重继承5.1 多重继承的二义性问题C++之继承一个新类从已有类那里获得其已有特性,这种现象称为继承。新类叫做派生类或子类,原来的已有类叫做基类或父类。值得注意的是派生类和基类永远是相...
C++之访问属性 C++之访问属性public属性为public的成员,不仅该可以在该成员所属类的内部进行访问,而且可以在类外通过类的对象来访问。private属性为private的成员,只能在该成员所属类的内部进行访问,而不能在类外通过类的对象来访问。换句话说,对外不可见。protected属性为protected的成员,只能在该类所属的类的内部和其类的派生类中进行访问。...
Linux 进程间关系和守护进程 Linux 进程间关系和守护进程进程间关系1. 进程组2. 作业2.1 作业与进程组的区别2.2 作业与Shell的联系3. 会话4. 作业控制守护进程1. 什么是守护进程?2. 创建守护进程的两种方法2.1 setsid函数2.2 daemon函数Linux 进程间关系和守护进程进程间关系1. 进程组进程组是一个或多个...
Linux多线程 Linux多线程1. 线程?线程是一个进程内部的控制序列。线程共享进程数据,但线程也拥有自己私有的上下文数据、私有栈结构。是程序执行的最小单位。2. Linux中的线程Linux中的线程是用进程模拟的。在Linux中,操作系统没有专门的结构来管理线程,而是用给线程分配一个PCB(更准确地说应该叫TCB)。我们知道,Linux在创建进程时做了有如下工作: 1. 分配一个进程...
gdb调试多流程程序 gdb调试多流程程序多进程默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。设置方法:set follow-fork-mode [parent|child] ...
Linux 进程信号 Linux 进程信号信号的概念程序在正常执行过程中出现的异常情况, Linux可以响应这些异常的情况,当这些异常情况发生时,我们的程序就要做出相应的动作产生信号的来源用户按键 非法的内存访问 硬件故障 浮点数溢出 软件条件产生处理信号的方式缺省处理 忽略(SIGKILL SIGSTOP 不能忽略) 捕捉信号(SLGKILL SIGSTOP 不能被...
C++之内存管理 C++之内存管理C中的内存管理malloccallocrealloc上述三种方式是用户在堆上开辟空间的办法,用完后必须用free释放,否则会造成内存泄露。 值得一提的是实际开辟的内存比申请的空间大:前面多申请32个字节,后面多申请4个字节。具体原因这里就不再阐述,详情见C语言动态分配内存C++中的内存管理C语言内存管理方式在C++中可以继续使用,同时C...
C语言动态分配内存 C语言动态分配内存malloc动态开辟内存的函数:void* malloc (size_t size);这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针 如果开辟成功,则返回⼀个指向开辟好空间的指针 如果开辟失败,则返回⼀个NULL指针,因此malloc的返回值⼀定要做检查 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在...
经典进程同步与互斥问题 经典进程同步与互斥问题1. 生产者-消费者问题1.1 简单的“生产者-消费者”问题设进程A、B是两个相互合作的进程,它们共享一个缓冲区,进程A向其中写入数据,进程B从中读出数据。producer:生产者进程,consumer:消费者进程。当缓冲区不空时,消费者便可以读数据;当缓冲区为空时,生产者便可以写数据。 设置信号量: full:表示有数据缓冲区的数目,初值为0; ...
C++获得程序运行时间 C++获得程序运行时间目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但是各种计时函数的精度不一样.下面对各种计时函数,做些简单记录.方法1,time()获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CU...
C++之函数重载 C++之函数重载重载的引入使得C++的灵活性有了极大提升,重载体现在只要在定义函数时形参列表(形参个数、类型、顺序你)不同,就可以重复定义同名函数。值得注意的是,函数的重载这里并对函数的返回值做出要求,那么也就意味着c++中函数的重载不关心返回值,即若定义了两个函数名、形参列表相同,返回值不同,那么编译器也会认为这两个函数其实是一个函数,在编译期间就会报错。事实上,C++编译器在编译时还是...
C++之右值引用 C++之右值引用c++11中的新概念,主要解决了移动语义和完美转发我们平常使用的引用都是指左值引用。 下面是一个测试例子void func ( int&amp;amp;amp; i ) { std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;func(int&amp;amp;amp; i) = &amp;quot; &amp;amp;