遍历

C++11新特性 auto

会有一股神秘感。 提交于 2019-12-10 06:07:48
【前言】 C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是C++能有多好,心里别提多酸了。这次C++11不负众望,再也不用羡慕别家人的for range了。 【使用场景】 ex1:遍历字符串 std :: string str = “hello , world” ; for ( auto ch : str ) { std :: cout << ch << std :: endl ; } 遍历str,输出每个字符,同时用上auto,简直是如虎添翼。 ex2:遍历数组 int arr [ ] = { 1 , 2 , 3 , 4 } ; for ( auto i : arr ) { std :: cout << i << std :: endl ; } 不用知道数组容器的大小,即可方便的遍历数组。 ex3:遍历stl 容器 std :: vector < std :: string > str_vec = { “i” , “like” , "google” } ; for ( auto & it : str_vec ) { it = “c ++ ” ; } 在这段程序中,可以返回引用值,通过引用可以修改容器内容。 ex4:遍历stl map std :: map < int , std :

先序遍历序列和中序遍历序列重建二叉树

Deadly 提交于 2019-12-10 04:10:37
//先序区间【preL,preR】,中序区间为【inL,inR】 node * creat ( int preL , int preR , int inL , int inR ) { if ( preL > preR ) { return NULL ; } node * root = new node ; root - > data = pre [ preL ] ; int k ; for ( int i = inL ; i <= inR ; i ++ ) { if ( pre [ preL ] == in [ i ] ) { k = i ; break ; } } int numleft = k - inL ; //根据数量去划分左右子树 root - > lchild = creat ( preL + 1 , preL + numleft , inL , k - 1 ) ; root - > rchild = creat ( preL + numleft + 1 , preR , k + 1 , inR ) ; return root ; } 来源: CSDN 作者: 耐、 链接: https://blog.csdn.net/qq_43964401/article/details/103463611

学习javaWeb第五天

本秂侑毒 提交于 2019-12-09 23:55:22
(一).使用jQuery实现全选与全不选 1.prop()方法设置或者返回被选元素的属性或者值 2.这个方法自带遍历,不需要手动遍历。 (返回的是属性的值); 3 $(“选择器”).prop(“属性”),值。 (设置属性和值); 4," $"(“选择器”).prop(“属性”,fuction(index,currentvalue)); (设置多个属性和值); 代码示例如上; (二)js遍历和jq遍历的区别 1.js:只是普通的for循环遍历 2.jq:$(nums).each(function(index){ alert(this+index); }); (this表示一个js的对象,index表示索引值) 3." $".each(" $"(nums),function(index){ alert(this+index) }); " $ “.each(” $"(element),fn); (遍历函数) (第一个参数是要遍历的数据(这个参数必须是jQuery对象),第二个参数是回调) (三)追加(文档处理:内部插入) 1、. $(“选择器或元素”).append(“内容”);追加信息在A元素标签后面,保留原信息 2、. $(“内容”).appendTo(“b选择器或元素”)内容插入B元素标签后面,保留原信息 3、 $(“选择器或元素”).prepend(“内容”)

数据结构与算法(十)---跳表的实现

余生长醉 提交于 2019-12-09 22:40:46
一、概述 什么是跳表 跳表怎么实现 二、跳表 1. 跳表的定义和实现意义 我们知道二分查找法的前提是有序数组,那么有没有类似的让链表也证婚词类似"二分"查找的算法,那就是 跳表 了:它支持快速的插入、删除、查找操作,实现方式没有红黑树那么复杂,甚至可以代替它。Redis的有序集合就是使用跳表实现的, 链表的随机访问数据的时间复杂度是O(n),我们在链表的基础上,每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作 索引 或 索引层 。图中的 down 表示 down 指针,指向下一级结点。 假如我们要差早16这个元素,我们通过第一级索引进行遍历,当到达13是,发现下一索引元素的值为17,那么16就应该在13和17之间,然后从索引层的13利用down指针,查找到原始链表的13,开始往后遍历得到需要查找的元素,原来需要对遍历10个,现在只需要6个节点;效率提高了;**如果在第一级索引上,在提取一层索引,会怎样呢? 这里直接查找1-64个元素,体验下效率: 查找效率从62次到了11次,这就是跳表。 2. 跳表的时间复杂度 普通链表的时间复杂度是O(N),怎么计算跳表的时间复杂度呢? 每两个结点会抽出一个结点作为上一级索引的结点,那第一级索引的结点个数大约就是 n/2,第二级索引的结点个数大约就是 n/4,第三级索引的结点个数大约就是 n/8,依次类推,也就是说,第 k

二叉树与堆

谁说胖子不能爱 提交于 2019-12-09 22:23:01
二叉树有哪几种存储方式?哪种适合于用数组来存储? node 数组存储? 两种特殊二叉树 满二叉树:除了叶子节点之外,每个节点都有左右两个子节点 完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大 节点的高度:节点到叶子节点的最长路径 节点的深度:根节点到这个节点的边的个数,从0开始 节点的层数:节点的深度加1,从1开始 树的高度:根节点的高度 树结构的存储: 1)链式存储法:节点=数据+左节点指针+右节点指针 2)数组存储法: 如果是完全二叉树:根节点存储在下标为1,那左子节点存储在下标 2 * i = 2 的位置,右子节点存储在 2 * i + 1 = 3 的位置。 如果节点 X 存储在数组中下标为 i 的位置,下标为 2 * i 的位置存储的就是左子节点,下标为 2 * i + 1 的位置存储的就是右子节点。反过来,下标为 i/2 的位置存储就是它的父节点。通过这种方式,我们只要知道根节点存储的位置(一般情况下,为了方便计算子节点,根节点会存储在下标为 1 的位置),这样就可以通过下标计算,把整棵树都串起来。 二叉树的遍历: 前序遍历 中序遍历 后序遍历 二叉查找树: 任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值 查找:类似二分查找 插入:也是先查找

Java--哈夫曼树创建和遍历

时光总嘲笑我的痴心妄想 提交于 2019-12-09 21:49:30
哈夫曼树的创建和遍历 import java.util.*; public class huffman { public static void main(String[] args) { int []arr={13,7,8,3,29,6,1}; Node root=huff(arr); //前序遍历打印赫夫曼树 if(root!=null){ System.out.println("赫夫曼树前序遍历为:"); root.preOrder();} else{ System.out.println("赫夫曼树为空"); } } //创建赫夫曼树 public static Node huff(int []arr){ //创建Node类型的集合,便于存取节点 List<Node>nodes=new ArrayList<Node>(); for(int a:arr){ nodes.add(new Node(a));//注意:此处是把Node类型节点放入,所以构造新的对象 } while(nodes.size()>1){ //排序,小到大 Collections.sort(nodes);//对集合内部元素排序 //System.out.println(nodes); //(1)取两个节点最小的构建子树 Node left=nodes.get(0); Node right=nodes.get

集合相关

假如想象 提交于 2019-12-09 21:48:52
集合笔记 集合架构 Collection(接口): API: 遍历方式: Set(接口): HashSet: HashSet研究的两个问题: LinkedHashSet: TreeSet: TreeSet的排序: List(接口): ArrayList: 遍历方式 LinkedList: 遍历方式:同ArrayList(略) LinkedList和ArrayList的区别 Vector:(淘汰) 遍历方式:同ArrayList(略) 总结: map(接口): HashMap: LinkedHashMap: HashTable: TreeMap: IdentityHashMap: ConcurrentHashMap: Properties: 集合工具类 Collections工具类: 集合架构 Collection(接口): 所有单例集合的父类Collection集合的功能所有单例集合都可以直接使用; API: public boolean add(E e): 把给定的对象添加到当前集合中 。 public void clear() :清空集合中所有的元素。 public boolean remove(E e): 把给定的对象在当前集合中删除。 public boolean contains(Object obj): 判断当前集合中是否包含给定的对象。 public boolean

遍历json的几种方式。

不想你离开。 提交于 2019-12-09 20:10:49
  json(JavaScript Object Notation),json是一种多用于存储和交换文本信息的语法。他能够进行数据的传输,通常和ajax一起使用。它具有体积小、速度快,易解析等诸多优点。 使用json首先要学习如何获取json的数据。j son类似Java里的map集合,两者的数据都是由键值对构成的。键可以使用引号,也可以不使用引号。 1.定义json //基本格式 var category= {"id": "1", 'name': "JavaSe"}; var categorys= [{"id": "1", 'name': "JavaSe"}, {"id": "2", 'name': "JavaEe"}, {"id": "3", 'name': "前端"}, {"id": "4", 'name': "其他"}]; 2.获取数据的几种方式 2.1 使用json对象名.键名获取数据 var target = category.name; 2.2 使用json对象名[键名]获取数据 var target = category[name]; 2.3 使用json数组对象名[索引]获取数据 var target = categorys[0]; 2.4 遍历json数组获取数据 从服务器端获取到的数据 [SysCategory{id=1, name='JavaSe'},

sync.Map(在并发环境中使用的map)

本小妞迷上赌 提交于 2019-12-09 18:51:36
sync.Map 有以下特性: 需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构。 无须初始化,直接声明即可。 sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除。 使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true,终止迭代遍历时,返回 false。 并发安全的 sync.Map 演示代码如下: package main ​ import ( "fmt" "sync" ) ​ func main() { ​ var scene sync.Map ​ // 将键值对保存到sync.Map scene.Store("greece", 97) scene.Store("london", 100) scene.Store("egypt", 200) ​ // 从sync.Map中根据键取值 fmt.Println(scene.Load("london")) ​ // 根据键删除对应的键值对

ES6上

纵然是瞬间 提交于 2019-12-09 16:35:32
1.let和const命令 1.1let命令 类似于var,let声明的变量只在let命令所在的代码块有效 1.不存在变量提升 2.暂时性死区 使用let声明之前,该变量都是不可用的 3.不允许重复声明 在相同作用域不能重复声明同一个变量,不能在函数内部重新声明变量 1.2块级作用域 1.let实际为JS新增了块级作用域 外层代码块不受内层代码块的影响 ES6规定在块级作用域之中,函数声明类似于let,在块级作用域之外不可引用 2.do表达式 在块级作用域之外没办法得到内层的值,加上do,成为do表达式,可以得到整个块级作用域的返回值 1.3const命令 1.声明一个只读的常量,一旦声明,不能改变,同样也不能只声明而不赋值 作用域和let一样,只在声明的块级作用域有效 2.实际上不是值不能改变,而是变量指向的那个地址不得改动 1.4声明变量的方法:let var const import class function 1.顶层对象的属性 ES6规定var和function声明的全局变量依旧是顶层对象的属性 let/const/class声明的全局变量不属于顶层对象的属性 2.global对象 引入global作为顶层对象,在所有环境下,global都是存在的,都可以拿到顶层对象 2.变量的解构赋值 2.1数组 1.按照一定模式从数组和对象中提取值,然后对变量进行赋值