-
2019-04-04 11:47:00
vim搜索设置高亮
2017年11月08日 21:23:00 renwendaojian 阅读数:589更多
个人分类: linux
<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; display: block; position: relative; padding-top: 16px;">
vim搜索设置高亮
linux vim打开文档搜索字符串时,设置被搜索到字符串高亮显示。
有两种方法:
1、临时设置:vim打开文档-->命令行形式输入:set hlsearch。
缺点:关闭文档后,下次打开,又需要重新设置一遍。
2、永久设置(推荐):在~/.vimrc中配制
vim ~/.vimrc
在文件中加上set hlsearch
然后保存退出便可。
优点:一次设置,永久生效。
</article>
更多相关内容 -
C++set容器set查找和统计
2020-09-10 15:58:05C++set容器set查找和统计 功能描述: 对set容器进行查找数据以及统计数据 #include <set> #include <iostream> using namespace std; void test() { set<int> s1; //插入 s1.insert(10); s1...C++set容器set查找和统计
功能描述:
- 对set容器进行查找数据以及统计数据
#include <set> #include <iostream> using namespace std; void test() { set<int> s1; //插入 s1.insert(10); s1.insert(30); s1.insert(20); s1.insert(40); //查找 set<int>::iterator pos = s1.find(30); if (pos != s1.end()) { cout << "找到了元素: " << *pos << endl; } else { cout << "未找到元素! " << endl; } //统计 //由于set容器不允许重复的值出现,所以结果非0即1 int num = s1.count(30); cout << "num = " << num << endl; } int main() { test(); return 0; } //查找 --- find (返回的是迭代器) //统计 --- count(对于set,结果为0或者1)
C++set容器set查找和统计
-
java set集合快速查找?
2019-10-27 18:52:45看书说散列集(表)即hashtable可以快速查找元素。但是据我所知,hashset并没有查找元素的方法。 如果要快速找到一个元素,首先要获得该元素的hashcode,但是我也没见过什么保存hashcode的代码。... -
Java中的Set
2021-09-10 13:27:09Set可以被认为是一个集合,集合内部是同类型的元素,他们之间没有先后顺序,但是不允许重复!!! Set中常用的方法有以下几个: 返回值 方法 boolean add( ) 向集合中添加元素 无 clear( ) 去掉集合中所有...Set的概念和特性以及常用方法
Set可以被认为是一个集合,集合内部是同类型的元素,他们之间没有先后顺序,但是不允许重复!!!
Set中常用的方法有以下几个:返回值 方法 boolean add( ) 向集合中添加元素 无 clear( ) 去掉集合中所有的元素 boolean contains( ) 判断集合中是否包含某一个元素 boolean isEmpty( ) 判断集合是否为空 Iterator iterator( ) 主要用于递归集合,返回一个Iterator()对象 boolean remove(E e) 从集合中去掉特定的对象 int size( ) 返回集合的大小 在Java中Set是一个继承自Collection接口,它主要有以下两个实现类:
TreeSet
TreeSet是基于平衡二叉搜索树(红黑树)实现的Set,因为二叉搜索树中序遍历为有序的(不明白可以看前一篇博客:二叉搜索树的思想,以及增删查改的实现)会多出来这么几种方法:
返回值 方法 E first() 返回集合中序遍历第一个 E last() 返回集合中序遍历最后一个 E pollFirst() 删除集合中序遍历第一个并返回 E pollLast() 删除集合中序遍历最后一个并返回 E floor(E e) 返回比传入元素小的所有元素中最大的一个,包含相等(因为传入的元素可能不在集合中,也可能在集合中,这个方法若传入元素在集合中则返回传入元素,如不在则返回比传入元素小的所有元素中最大的一个) E lower(E e) 返回比传入元素小的所有元素中最大的一个 E ceiling(E e) 返回比传入元素大的所有元素中最小的一个(包含传入元素和上面floor()一起理解) E higher(E e) 返回比传入元素大的所有元素中最小的一个(不包含传入元素) 下面通过代码演示一下上述方法:
public static void main(String[] args) { TreeSet<Integer> set = new TreeSet<>(); set.add(1); set.add(9); set.add(5); set.add(3); set.add(10); set.add(2); System.out.println("first " + set.first()); System.out.println("last " + set.last()); //比key小的里面最大的一个 System.out.println("lower " + set.lower(3)); //比key小的里面最大的一个(包括key) System.out.println("floor " + set.floor(3)); //比key大的里面最小的(包括key) System.out.println("ceiling " + set.ceiling(3)); //比key大的里面最小的 System.out.println("higher " + set.higher(3)); System.out.println("contains " + set.contains(3)); System.out.println("remove(4) " + set.remove(4)); System.out.println("remove(3) " + set.remove(3)); System.out.println("size " + set.size()); System.out.println("是否为空 " + set.isEmpty()); set.clear(); System.out.println("是否为空 " + set.isEmpty()); }
运行结果:
需要注意的是,因为在将元素插入搜索树的过程中会比较带插入元素和集合中元素大小,所以当TreeSet中要存入自己实现的类为元素时,该类必须实现Comparab接口或者在创建Set时传入一个该类的Comparator比较器,对于Comparable和Comparator不熟悉的同学建议去看这篇博客:Java中的Comparable和Comparator到底该怎么用看完就全明白了HashSet
HashSet是基于哈希表实现的,因为哈希表内部元素是无序的,所以HashSet不像TreeSet,HashSet没有和元素顺序有关的方法,像上面提到的first(),last(),lower()等。
下面演示一下:import java.util.HashSet; import java.util.Set; public class HashSetDemo { public static void main(String[] args) { Set<Integer> set = new HashSet<>(); set.add(1); set.add(3); set.add(9); set.add(2); set.add(5); set.add(4); set.add(10); set.add(8); System.out.println("remove(9) " + set.remove(9)); System.out.println("contains(8) " + set.contains(8)); System.out.println("isEmpty() " + set.isEmpty()); System.out.println("size() " + set.size()); set.clear(); System.out.println("isEmpty() " + set.isEmpty()); }
运行结果:
和TreeSet对元素要求不同,因为哈希表需要根据元素得到哈希值然后,根据这个哈希值去计算该元素在哈希表中的下标,所以当我们要在HashSet中存入自己实现的类为元素时,需要实现hashCode() 和 equals() 方法(为什么还要实现equals方法? 因为要保证相同的元素的哈希值相同,程序又不知道哪两个元素相同,所以需要实现equals方法)。
举个例子,下面是我自己实现的Person类,当我们需要创建一个 “Set< Person > set = new HashSet()”时:import java.util.Objects; public class Person { public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } //实现equals()方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } //实现hashCode()方法 @Override public int hashCode() { return Objects.hash(name, age); } }
Set两种实现类的比较
Set底层结构 TreeSet HashSet 底层结构 红黑树 哈希桶 插入/删除/查找 时间复杂度 O(logN) O(1) 是否有序 关于Key有序 理论上无序 线程安全 不安全 不安全 插入/删除/查找 区别 按照红黑树的特性进行插入和删除 1.先计算Key哈希地址 2. 然后进行插入和删除 比较与重写 TreeSet中的元素必须实现Comparable或者在构建Set时传入元素专属Comparator,否则抛出ClassCastException异常 自定义类型需要重写equals和hashCode方法 应用场景 需要Key有序的场景 Key是否有序不关心,需要更高的时间性能 -
基于链表或二分搜索树实现Set集合(JAVA语言版)
2019-03-11 21:42:29Set集合一个重要的性质,不含有重复元素,在这里用自己写的二分搜索树实现,这个二分搜索树不存重复元素,符合Set集合的性质 /** * @author BestQiang */ public class BST<E extends Comparable<E&...Set集合一个重要的性质,不含有重复元素,在这里用自己写的二分搜索树实现,这个二分搜索树不存重复元素,符合Set集合的性质
/** * @author BestQiang */ public class BST<E extends Comparable<E>> { // 构建树的节点类 private class Node { public E e; public Node left, right; public Node(E e) { this.e = e; left = null; right = null; } } // 声明树的根节点 private Node root; // 声明树的大小 private int size; // 二分搜索树的构造方法 public BST() { root = null; size = 0; } // 获取二分搜索树的大小 public int size() { return size; } // 判断二分搜索树是否为空树 public boolean isEmpty() { return size == 0; } // 此二分搜索树不包括重复元素的情况加进行添加 public void add(E e) { //下面的方法要进行非空节点判断,不够优雅 /* if (root == null) { root = new Node(e); } else { add(root, e); }*/ root = add(root, e); } // 以node为根的二分搜索树中插入元素E,递归算法 private Node add(Node node, E e) { // 存在重复代码段,代码看起来显得冗余 /* if (e.equals(node.e)) { return; } else if (e.compareTo(node.e) < 0 && node.left == null) { node.left = new Node(e); size++; return; } else if (e.compareTo(node.e) > 0 && node.right == null) { node.right = new Node(e); size++; return; }*/ // 添加节点时巧妙使用递归,代码优雅 if (node == null) { size++; return new Node(e); } if (e.compareTo(node.e) < 0) { node.left = add(node.left, e); } else { node.right = add(node.right, e); } return node; } // 看二分搜索树中是否包含元素e public boolean contains(E e) { return contains(root, e); } // 看以node为根的二分搜索树中是否包含元素e, 递归算法 private boolean contains(Node node, E e) { if (node == null) { return false; } if (e.equals(node.e)) { return true; } else { if (e.compareTo(node.e) < 0) { return contains(node.left, e); } else { return contains(node.right, e); } } } // 二分搜索树的前序遍历 public void preOrder() { preOrder(root); } // 前序遍历以node为根的二分搜索树,递归算法 private void preOrder(Node node) { if (node == null) { return; } System.out.println(node.e); preOrder(node.left); preOrder(node.right); } // 中序遍历和后序遍历同前序遍历,改变输出语句位置即可 // 获取二分搜索树的最小值和最大值 public E getMin() { if (size == 0) { throw new IllegalArgumentException("BST is empty!"); } return getMin(root); } private E getMin(Node node) { if (node.left != null) { return getMin(node.left); } else { return node.e; } } // 删除二分搜索树的最小值 public E removeMin() { E res = getMin(); root = removeMin(root); return res; } // 删除以node为根的二分搜索树的最小节点 // 返回删除节点后新的二分搜索树的根 private Node removeMin(Node node) { if (node.left == null) { Node rightNode = node.right; node.right = null; size--; // 找到这个节点,就返回rightNode return rightNode; } // 从宏观看,其实就是把删除那个节点的right赋值给根节点的left,找不到就一直递归着找 node.left = removeMin(node.left); return node; } // 从二分搜索树中删除元素为e的节点 public void remove(E e) { root = remove(root, e); } // 返回删除节点后新的二分搜索树的根 private Node remove(Node node, E e) { if (node == null) { return null; } if (e.compareTo(node.e) < 0) { node.left = remove(node.left, e); return node; } else if (e.compareTo(node.e) > 0) { node.right = remove(node.right, e); return node; } else { // 待删除节点左子树为null的情况 if(node.left == null) { Node rightNode = node.right; node.right = null; size --; return rightNode; } // 待删除节点右子树为null的情况 if(node.right == null) { Node leftNode = node.left; node.left = null; size --; return leftNode; } // 待删除节点左右子树均不为空的情况 // 找到比待删除节点大的最小节点,即待删除节点右子树的最小节点 // 用这个节点顶替待删除节点的位置 Node successor = new Node(getMin(node.right)); successor.right = removeMin(node.right); successor.left = node.left; node.left = node.right = null; return successor; } }
/** * @author BestQiang */ public interface Set<E> { void add(E e); void remove(E e); boolean contains(E e); int getSize(); boolean isEmpty(); }
直接调用二分搜索树的方法即可实现Set
/** * @author BestQiang */ public class BSTSet<E extends Comparable<E>> implements Set<E> { private BST<E> bst; public BSTSet() { bst = new BST<>(); } @Override public void add(E e) { bst.add(e); } @Override public void remove(E e) { bst.remove(e); } @Override public boolean contains(E e) { return bst.contains(e); } @Override public int getSize() { return bst.size(); } @Override public boolean isEmpty() { return bst.isEmpty(); } }
基于链表实现二分搜索树此时要特别注意,链表可以添加重复元素,所以Set集合中添加元素时要先判断链表中是否存在
/** * @author BestQiang */ public class LinkedList<E> { private class Node { public E e; public Node next; public Node(E e, Node next) { this.e = e; this.next = next; } public Node(E e) { this(e, null); } public Node() { this(null, null); } @Override public String toString() { return e.toString(); } } private Node dummyHead; private int size; public LinkedList() { dummyHead = new Node(null, null); size = 0; } // 获取链表中的元素个数 public int getSize() { return size; } // 判断链表是否为null public boolean isEmpty() { return size == 0; } // 在链表的index(0-based)位置添加新的元素e // 在链表中不是一个常用的操作, 练习用 public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("Add faild. Illegal index."); } Node prev = dummyHead; // for循环,找到插入节点的前一个节点 for (int i = 0; i < index; i++) { prev = prev.next; } prev.next = new Node(e, prev.next); size++; } // 在链表末尾添加新的元素e // 在链表头添加新的元素e public void addFirst(E e) { // Node node = new Node(e); // node.next = head; // head = node; /*head = new Node(e, head); size++;*/ add(0, e); } public void addLast(E e) { add(size, e); } // 获得链表的第index(0-based)个位置的元素 // 在链表中不是一个常用的操作,练习用: public E get(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException("Get failed. Illegal index."); } Node cur = dummyHead.next; for (int i = 0; i < index; i++) { cur = cur.next; } return cur.e; } // 获得链表的第一个元素 public E getFirst() { return get(0); } // 获得链表的最后一个元素 public E getLast() { return get(size - 1); } // 修改链表的第index(0-based)个位置的元素为e // 在链表中不是一个常用的操作,练习用 public void set(int index, E e) { if (index < 0 || index >= size) throw new IllegalArgumentException("Set failed. Illegal index."); Node cur = dummyHead.next; for (int i = 0; i < index; i++) { cur = cur.next; } cur.e = e; } // 查找链表中是否有元素e public boolean contains(E e) { Node cur = dummyHead.next; /*while (!cur.e.equals(e)&& cur.next != null ) { cur = cur.next; } if(cur.e.equals(e)) { return true; } else { return false; }*/ while (cur != null) { if (cur.e.equals(e)) return true; cur = cur.next; } return false; } // 从链表中删除index(0-based)位置的元素,返回删除的元素 // 在链表中不是一个常用的操作,练习用 public E remove(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException(); } // 注意此时和修改链表的第index元素不同,此时需要对删除的元素的上个节点进行操作,所以需要获取上一个节点 Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } // 获取要删除的值 Node retNode = prev.next; // 1.把上一个节点的next=要删除节点的next prev.next = retNode.next; // 2.把要删除的next置为空,此时该next会被jvm自动进行垃圾回收 retNode.next = null; size --; return retNode.e; } // 从链表中删除第一个元素, 返回删除的元素 public E removeFirst() { return remove(0); } // 从链表中删除最后一个元素, 返回删除的元素 public E removeLast() { return remove(size - 1); } // 从链表中删除元素e public void removeElement(E e) { Node pre = dummyHead; while(pre.next != null ) { if(pre.next.e.equals(e)) { break; } pre = pre.next; } if(pre.next != null) { pre.next = pre.next.next; pre.next.next = null; size --; } } @Override public String toString() { StringBuilder res = new StringBuilder(); Node cur = dummyHead.next; while (cur != null) { res.append(cur + "->"); cur = cur.next; } /*for (cur = dummyHead.next; cur != null; cur = cur.next) { res.append(cur + "->"); }*/ res.append("NULL"); return res.toString(); } }
/** * @author BestQiang */ public class LinkedListSet<E> implements Set<E> { private LinkedList<E> list; public LinkedListSet() { list = new LinkedList<>(); } @Override public void add(E e) { if(!list.contains(e)) { list.addFirst(e); } } @Override public void remove(E e) { list.removeElement(e); } @Override public boolean contains(E e) { return list.contains(e); } @Override public int getSize() { return list.getSize(); } @Override public boolean isEmpty() { return list.isEmpty(); } }
-
C++中set用法详解
2021-05-25 07:20:241.关于setC++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,... -
set命令详解
2021-06-19 14:36:11set: set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...] 设定或取消设定 shell 选项和位置参数的值。 改变 shell 选项和位置参数的值,或者显示 shell 变量的 名称和值。 选项: -a 标记修改的或者... -
C++map和set的介绍及使用
2022-02-26 15:11:35C++map和set的介绍及使用零、前言一、关联式容器二、键值对三、C++中的set1、set的介绍2、set的使用四、C++中的multiset五、C++中的map1、map的介绍2、map的使用六、C++中的multimap 零、前言 本章主要讲解C++中的... -
Map和Set详细介绍~
2022-03-24 11:13:36Map和Set详细介绍~ -
C++ STL set容器常用用法 set 容器查找和统计
2022-03-28 20:25:06它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。 set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素... -
Java中Set的使用(转载)
2021-02-12 19:17:27在Java中使用Set,可以方便地将需要的类型以集合类型保存在一个变量中.主要应用在显示列表.Set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 ... -
MySQL的SET字段类型使用方法
2021-01-19 05:20:03MySQL的SET字段类型使用方法SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。这样SET成员值本身不能包含逗号。例如,... -
map和set的概念及使用
2020-04-20 21:42:38树型结构的关联式 树型结构的关联式容器主要有四种:map、set、multimap、multiset四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。 3.1 set 3.1.1 set的介绍 set是... -
Java集合--Set(基础)
2021-03-17 13:46:271.Set上一篇,我们介绍Java中的List集合。本篇,让我们继续学习,来了解下Set集合;Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。在判断重复元素的时候... -
JAVA对redis中set元素进行批量增加修改与排序搜索查询
2019-07-02 19:43:14由于业务需要与其它小组配合,舍弃了sortedset,采用set存储元素(整型),在StringRedisTemplate缺少直接方法情况下利用后台代码完成对redis中set元素进行批量增加修改与排序搜索查询。 首先是list页面(包含首次... -
【mysql】MYSQL数据库中SET数据类型介绍
2021-01-30 02:21:09【mysql】MYSQL数据库中SET数据类型介绍林氏智造 于 2013-12-07 发布4538 人已阅SET类型】SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间... -
【攻克java集合系列(三)】java集合中的Set系列集合全面分析
2021-11-29 19:52:54之前我们已经对List集合进行了比较深入的分析,加下来轮到Set集合了,开干! 文章目录 -
JVM-G1垃圾回收器:G1回收流程(Rset、CSet、SATB)
2020-08-09 20:24:19第一个名词:三色标记法,第二个名词:writer barrier(写栅栏) 首先解释第一个名词:三色标记算法 首先我们知道无论是 g1还是CMS垃圾标记算法都叫做根可达(root searching),首先搜索比如 线程栈上的对象、静态... -
Java 集合List、Set、Map知识结构大全详解
2019-07-17 16:37:51目录 概述 一、Collection 接口 (1)List列表 —— 有序、值可重复 (2)Set 集 —— 值不可重复 二、Map 接口 (1)HashMap —— 无序 1、取模法 2、Hash碰撞冲突 ...三、List、Set、Map的值能否... -
seek_set 在C语言中fseek()的功能
2021-05-20 19:35:27fseek(f,0,SEEK_SET);fseek(f,0,SEEK_SET);什么意思?意思是把文件指针指向文件的开头 fseek 函数名: fseek 功 能: 重定位流上的文件指针 用 法: int fseek(FILE *stream, long offset, int fromwhere); 描 述: 函数... -
c++set讲解
2017-08-18 15:11:051.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了... -
C++:map,unordered_map,set和unordered_set的用法和区别
2020-12-24 15:23:42map内部实现了一个 红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树), 红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map... -
set和multiset的用法详解
2019-04-16 21:00:12一、set文档介绍 1. set是按照一定次序存储元素的容器 2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中... -
ipset如何与netfilter内核模块进行通信
2018-12-14 17:31:32最近需要使用ipset,iptables,和netfilter,所以把三者的源代码看大概阅读了一遍。 前面我们学习过应用层ipset和netfilter模块之间通信是采用的netlink套接字 用户空间的ipset命令通过 libipset.so 这个库和内核... -
React hooks useState set数据失效
2021-01-20 23:00:471、栗子 interface per{ contractId?:string | any, orgId?:string | any, contractName?:string | any, orgName?:string| any, post?:string| any, phone?:string| any, ... contractName: '', -
List和Set
2019-07-07 18:51:34用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 接口 Set 一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 ... -
Map 和 Set (Java详细讲解)看我就够了
2022-03-18 18:32:05Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的 搜索方式有: 1.直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢 2.二分查找,时间复杂度为,但...