指针

C++文件读写详解(ofstream,ifstream,fstream)

删除回忆录丶 提交于 2019-12-29 04:44:35
C++文件读写详解(ofstream,ifstream,fstream)    这里主要是讨论fstream的内容: 1 #include <fstream> 2 ofstream //文件写操作 内存写入存储设备 3 ifstream //文件读操作,存储设备读区到内存中 4 fstream //读写操作,对打开的文件可进行读写操作 1、打开文件    在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作    函数:open() 1 public member function 2 3 void open ( const char * filename, 4 ios_base::openmode mode = ios_base::in | ios_base::out ); 5 6 void open(const wchar_t *_Filename, 7 ios_base::openmode mode= ios_base::in | ios_base::out, 8 int prot = ios_base::_Openprot); 9 /* 10 参数:filename 操作文件名 11 mode 打开文件的方式 12 prot 打开文件的属性 //基本很少用到

C#内存管理与垃圾回收

核能气质少年 提交于 2019-12-29 02:32:45
垃圾回收还得从根说起,就像生儿育女一样。 根 :根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null。根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为定义的变量就存在线程栈上,类型对象指针存在托管堆中,因为实例化一个对象要额外分配两个字段“类型对象指针”和“同步块索引”。 类型对象指针的作用 。实例化一个对象并没有为其方法分配内存,类型的静态字段分配内存,而实例要向调用属于类型的一些东西,就必须通过类型对象指针。如对象的实例是共用类型的方法,实例只需要通过类型对象指针调用类型的方法,更多关于方法的调用请看我的 这篇博客 。 同步块索引的作用 。1:用于lock,使对象在同一时刻只能一个线程访问;2:用于获取对象的hashCode;3:在垃圾回收时标志某个对象是否是垃圾。关于 lock 最经典的一个例子就是单例了,大家的实现都是实例化一个object对象,然后锁住它,然后在判断是否要实例要实现单例的那个对象。我们为什么要实例化一个object,而不是直接lock(typeof(object)),那是因为这样会把object这个类型给锁住,锁住期间,任何使用线程使用lock(typeof(object))就必须等待,object还是可以正常使用。lock能起到单线程访问的原因是:它里面有一个空的for死循环

java中.next()方法的作用及应用

帅比萌擦擦* 提交于 2019-12-28 15:55:49
1、.next()方法的作用:指针指向下一条记录,有记录(有值)返回true并把记录内容存入到对应的对象中,也就是obj.next()的obj中。如果没有返回false。 2、.next()方法的应用:一般和ResultSet对象和while循环一起使用,去迭代结果集,并在循环中调用getXXX(intfieldIndex)/getXXX(String columnName)方法获取字段值。 过程:ResultSet对象具有指向其当前数据行的指针。开始,指针被置于第一行。.next()方法将指针移动到下一行,然后while循环迭代遍历ResultSet对象。 while (obj.next()) { } 光标移动到下一行数据,有值(数据)返回true并迭代遍历,没有返回false退出循环。 来源: CSDN 作者: simple_T 链接: https://blog.csdn.net/simple_T/article/details/103744115

数据结构:链表讲解

拈花ヽ惹草 提交于 2019-12-28 15:12:11
数据结构:链表讲解 一、缓存淘汰策略: 缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去?哪些数据应该保留?这就需要缓存淘汰策略来决定。 简单理解: 就是当缓存被用满时清理数据的优先顺序 。 先进先出策略 FIFO(First In, First Out) 最少使用策略 LFU(Least Frequently Used) 最近最少使用策略 LRU(Least Recently Used) 以上策略举个栗子: 假如,你买了很多书,但有一天发现,书太多了,太占书房空间了,打算丢掉一些书籍; 丢到刚买的书:先进先出策略 丢到买完一直都没有读过的书:最少使用策略 丢到最近刚买的书,但是一直都没怎么读过:最近最少使用策略 二、数组与链表的区别: 1.底层存储的结构区别: 我们可以从 底层的存储结构 来看。数组需要一块 连续的内存空间 来存储,对内存的要求比较高。 如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 链表恰恰相反,它并 不需要一块连续的内存空间 ,它通过 指针 将一组零散的内存块串联起来使用,其中,我们把内存块称为链表的 结点 。 为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的 下一个结点的地址 。结点地址的指针叫作 后继指针 next 。

【iOS面试系列-1】iOS中@property 后assign,copy,retain,weak,strong的意义与区别(必考-必须详细掌握)

帅比萌擦擦* 提交于 2019-12-28 14:04:11
来源:网络 assign : 普通(简单)赋值,一般常用于基本数据类型,常见委托设计模式,一次来防止循环引用。不更改索引计数(Reference Counting)。 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) retain :保留计数,获得到了对象的所有权,引用计数在原有基础上+1.释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 。我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到 2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。retain之后count加一。alloc之后count就是1,release就会调用dealloc销毁这个对象。如果 retain,需要release两次。通常在method中把参数赋给成员变量时需要retain。NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会 被 执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(Collection

leetcode15. 三数之和

☆樱花仙子☆ 提交于 2019-12-28 11:03:50
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 思路: 对数组进行排序,利用有序数组的性质设置三指针。 i 为当前指针, low=i+1 , high=len(nums)-1 三指针元素和相加为 ans=nums[i]+nums[low]+nums[high] 这时候若 ans=0 ,则三指针符合题意,将其加入结果列表。但题目要求不能取重复值,有序列表中,重复元素是连续的,因此循环执行 low=low+1 , high=high-1 , 直到两指针相遇或出现不同的元素。 若 ans>0 ,此时说明high偏大,根据 滑动窗口 的思想,high指针左移。 同理若 ans<0 ,low指针右移。 class Solution : def threeSum ( self , nums : List [ int ] ) - > List [ List [ int ] ] : nums . sort ( ) l = [ ] for i in range ( 0 , len (

归并排序的分析与Java实现

邮差的信 提交于 2019-12-28 04:06:39
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 归并排序算法依赖归并操作。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并排序在众多排序算法中既是稳定排序,效率也比较高,同时,归并排序不仅可以用于内排序,还可以用于外排序。 1.两个有序数列的合并 设两个有序数列放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量 R1中,待合并完成后将 R1 复制回 R[low..high]中。 (1)合并过程 合并过程中,设置 i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置。 合并时依次比较 R[i]和 R[j]的关键字,取关键字较小的记录复制到 R1[p]中,然后将被复制记录的指针 i 或 j 加 1,以及指向复制位置的指针 p 加 1。 重复这一过程直至两个输入的子文件有一个已全部复制完毕,此时将另一非空的子文件中剩余记录依次复制到 R1 中即可。 (2)动态申请 R1 实现时,R1 是动态申请的,因为申请的空间可能很大,所以在工程上应用时,可能需要加入申请空间是否成功的处理。 2.归并排序的实现 (1)二路归并的思路 将数组划均分为两个子数组; 对两个字数组进行排序; 将排序好的两个字数组归并。 所谓 N路归并 是指将数组均分为N个子数组

归并排序就这么简单

旧街凉风 提交于 2019-12-28 04:05:47
归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是 归并排序 ,希望大家看完能够理解并手写出归并排序快速排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出。 归并排序的介绍 来源百度百科: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法 (Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为二路归并。 过程描述: 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。 原理: 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针

weak_ptr解决shared_ptr环状引用所引起的内存泄漏

跟風遠走 提交于 2019-12-27 21:38:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include<string> #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> class parent; class children; typedef boost::shared_ptr<parent> parent_ptr; typedef boost::shared_ptr<children> children_ptr; class parent { public: ~parent() { std::cout <<"destroying parent\n"; } public: children_ptr children; }; class children { public: ~children() { std::cout <<"destroying children\n"; } public: parent_ptr parent; }; void test() { parent_ptr father(new parent()); children_ptr son

c++ 智能指针

匆匆过客 提交于 2019-12-27 21:37:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1 auto_ptr。智能指针销毁的时候自动delete所包含的指针。对象只能被一份智能指针持有。通过智能指针的复制构造函数会将前一个的指针置为null 使用方式如下: class Person{ std::string name; public: Person() :name("kk"){ std::cout<<"construct Person"<<std::endl; } ~Person(){ std::cout<<"deconstruct Person"<<std::endl; } void show(){ std::cout<<"show person: " + name<<std::endl; } void show1(){ std::cout<<"show person" <<std::endl; } }; auto_ptr<Person> ptr(new Person()); ptr->show();//ok ptr.get()->show();//ok auto_ptr<Person> ptr1= ptr; ptr1->show();//ok ptr->show();//错误。一旦通过ptr1= ptr复制后,智能指针包含的的指针即被清空变为null了(注意这个地方若是改为ptr->show1