• 等级
  • 15749 访问
  • 79 原创
  • 190 转发
  • 55813 排名
  • 8 评论
  • 5 获赞

51 上一个排列、下一个排列

给定一个整数数组来表示排列,找出其上一个排列。 样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1]  思路: 1、上一个排列就是所有全排列按照升序排列后的上一个排列 2、如数字排列63624578,其上一个排列为63587642 由于是在所有升序排列中找到上一个排列,所以对于某一个排列,我们假设从某一位开始,后面...

2018-08-20 18:08:31

socket阻塞与非阻塞,同步与异步、I/O模型

 https://blog.csdn.net/hguisu/article/details/7453390

2018-08-16 20:52:41

服务器编程框架

虽然服务器种类很多,但编程框架基本相同,不同之处在于逻辑处理        I/O处理单元是服务器管理客户连接的模块。完成以下工作:                  等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端                  但数据的收发不一定在I/O处理单元中执行,也可能在逻辑单元中执行,具体在何处执行,取决于事件处理方式 一个逻辑单元...

2018-08-16 20:32:34

高性能服务器程序框架

服务器主要包括如下三个主要模块: I/O处理单元,四种I/O模型和两种高效事件处理方式 逻辑单元,逻辑单元的高效并发方式 存储单元,服务器的可选模块 服务器模型 C/S模型:所有客户端都通过访问服务器来获取所需的资源 C/S模型的运行逻辑: 服务器启动后,首先创建一个或多个监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接。 ...

2018-08-16 20:10:28

两种高效的事件处理方式

Reactor模式 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元) 除此之外主线程不做其他实质性的工作,读写数据以及接受新的连接,以及处理客户请求均在客户线程中完成。 使用同步I/O模型(以epoll_wait为例)实现的Reactor模式的工作流程: 1)主线程往epoll内核事件表中注册socket上的读就绪事件。 2)...

2018-08-16 19:45:50

Linux操作系统基础

https://blog.csdn.net/syt8945/article/details/50838679

2018-08-15 12:28:18

内存分配的三种方式

把所有的点都说到,才能说明你有足够的项目经验,在实际工作的时候不会因为一些小问题而产生一些严重的bug,也证明了你有实力胜任这份工作。 要回答这个问题,我们必须先要理解C++的内存管理方式,需要站在内存四区的角度去审视一下代码,这样整个理解了内存分配的方式,回答的时候就只需要注意一些细节了。写一个例子然后画一下内存示意图。 int getmem(char **myp,int length)/...

2018-08-14 14:57:58

智能指针

智能指针是行为类似于指针的类对象。 为什么需要智能指针?  为了避免当系统异常退出的时候避免资源泄漏(内存) 创建指向str的指针ps。有一个问题。如果函数异常终止,则本地变量将从栈内存中删除——因此ps占据的内存将被释放,如果ps指向的内存也被释放了,则就不需要后面的智能指针了。 或者如果ps有一个析构函数,当ps过期时,调用它的析构函数删除它指向的内存就行。可惜,没有。原因是ps是一个常...

2018-08-14 11:08:30

c++线程中的几种锁

这个是在中兴面试中被面试问到的一个题“你知道线程中的自旋锁么?”,我当时一脸懵逼,不知道。回来后整理下,在这里对线程中的锁进行一个学习。 线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能越强大,性能就会越低。 1、互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线...

2018-08-12 20:20:42

有关线程池的面试题

 (1)因为我的项目中写到一个项目:简单线程池的实现,那么面试官就问我“如何保证线程池是线程安全的”。 首先给大家普及下线程池的知识。我写的线程池是使用POSIX写的。线程池整个项目中包括两个类:一个是Task类,用于描述执行一个任务的方法(一个函数)和执行这个任务所需要的参数(函数的参数)。另外一个类就是我们的线程池类ThreadPool类,在线程池中主要有两个队列,一个是Task类队列,用于...

2018-08-12 20:17:19

STL之vector

容器、结构与分类  容器  :所有的容器都维护着两个迭代器,分别指向头和尾 STL容器是将运用最广的数据结构实现出来 根据数据在容器中的排列特性,将这些数据结构分为序列式和关联式两种 序列式容器(advlsqp)array\deque\vector\list\queue\priority-queue Array 连续空间,其迭代器就是指针。     Vector Vector&l...

2018-08-12 16:31:22

STL之(底层哈希表)hash_set、hash_multiset、hash_map,hash_multimap

hash_set与hash_multiset: 实值就是键值 以hashtable为底层机制,所以几乎所有的hash_set行为,都是转调hashtable的操作行为。   与set、multiset相比,hash_set、hash_multiset没有自动排序功能。   hash_set与set一样,实值就是键值。使用方式与set完全相同 插入元素操作采用底层机制hashtable...

2018-08-12 16:20:07

STL之(哈希表)hashtable

容器hashtable(哈希表):另外一种底层机制 其基本原理是:使用一个下标范围比较大的数组来存储元素。把关键字Key通过一个固定的算法函数即所谓的哈希函数(散列函数)转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的list空间里。也可以简单的理解为,按照关键字key为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地...

2018-08-12 16:07:30

STL之(底层红黑树)set、multiset、map、multimap

set、multset容器 set/multiset是以rb_tree为底层机构,因此有元素自动排序的特性。 排序的依据是key,而set/multiset的value和key合一:value就是key,其中value由key和data组成。 set/multiset提供遍历操作和迭代器,按正常规则(++iter)遍历,便能获得排序状态(sorted) 我们无法使用set/multiset...

2018-08-12 15:55:54

STL之关联式容器----红黑树

标准STL关联式容器分为set(集合)和map(映射表)两大类以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表),这些容器的底层机制均以RB-tree红黑树完成。它也是一个独立容器,但不开放给外界用 不在标准规格之列的关联式容器hash table(散列表/哈希表),和以hash table为底层机制的hash_set(散列集合)、hash_map(散列...

2018-08-12 10:13:45

STL之stack、queue、priority_queue

栈的底层结构: 以缺省情况下的deque作为其底层容器(封闭底端出口和入口,利用deque的成员函数完成stack成员函数的定义),list也可以作为其底层容器 一种先进后出的数据结构,只能在最顶端新增、移除、取出元素。即不能遍历,所以stack没有迭代器      队列的底层结构: 以缺省情况下的deque作为其底层容器(封闭deque的底端出口和顶端入口,利用deque的成员函...

2018-08-12 09:09:33

STL面试题

1、说说std::vector的底层(存储)机制。(如何实现vector) vector维护的是一个连续线性空间(动态数组),它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围(注意finish指向的是最后一个元素后面那个元素)并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。    当我们以push_back()将新元素插入于vec...

2018-08-11 22:34:30

STL容器迭代器失效情况分析、总结

当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此我们为了避免危险,应该获取insert或者erase返回的迭代器,以便用重新获取的新的有效的迭代器进行正确的操作  iter=vec.insert(iter); iter=vec.erase(iter);   迭代器失效的类型:  1.由于插入元素,使得容器元素整体“迁移”导致存放原容器元素...

2018-08-11 22:27:42

STL之deque

deque的底层实现 vector是单向开口的连续线性空间,deque则是一种双向开口的由一段一段的定量连续空间组成,即可以在头尾两端分别做元素的插入和删除操作。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间而我们也知道vector的头部操作效率非常差。   deque采用一块map(不是STL中的map)作为主控。这里的map是一小块连续空间,其中每个元素(此处称为...

2018-08-11 22:05:19

STL之list

list的设计 list由三部分构成:list节点、list迭代器、list本身 特点:每次插入或删除一个元素,就配置或释放一个空间。对空间的运用不浪费 对于任何位置的元素插入或元素移除,list永远是常数时间 list节点 list是一个双向链表,所以其list结点中有前后两个指针,当然还有值。如下: //组成list的结点 template<typename T> s...

2018-08-11 20:25:37

practicePLUS

关注
  • 计算机软件
  • 中国