首页 > 其他分享 >[namespace hdk] ordered_vector

[namespace hdk] ordered_vector

时间:2024-07-04 11:53:44浏览次数:22  
标签:ordered int pos remove bound vector inline hdk

功能:

  1. 已重载[]运算符
  2. 已重载构造函数
  3. clear()
  4. it() 以std::vector形式返回自身
  5. print(char=' ',char='\n') 输出,第一个参数为分隔符,第二个参数为结束符
  6. count(x) 查找x的出现次数
  7. find(x) 判断x是否出现,是返回1,否则返回0
  8. empty() 判断当前是否为空
  9. size() 返回当前元素个数
  10. lower_bound(x) 查找第一个大于等于x的位置,返回其下标
  11. upper_bound(x) 查找第一个大于x的位置,返回其下标
  12. insert(x) 插入一个元素x
  13. remove(x) 删除一个等于x的元素,未找到则不执行
  14. remove_all(x) 删除所有等于x的元素
  15. remove_smaller(x,bool=false) 删除全部小于x的元素 (bool=true 时为小于等于)
  16. remove_larger(x,bool=false) 删除全部大于x的元素 (bool=true 时为大于等于)
  17. findpre(x) 寻找小于x的最近元素,返回其下标,或者返回-1
  18. findnext(x) 寻找大于x的最近元素,返回其下标,或者返回-1
  19. nearestabs(x) 寻找x与当前所有元素之差的最小值,不存在则返回0
  20. remove_nearestabs(x) 寻找x与当前所有元素之差的最小值,并将其删除,不存在则返回0
  21. locate_nearestabs(x) 寻找x与当前所有元素之差的最小值,返回其下标,或者返回-1

定义:

ordered_vector<int> a;
ordered_vector<int> b();
ordered_vector<int> c({1,2,3,3,4,5,6,7});
ordered_vector<int> d({});
std::vector<int> s{1,2,3,4,5};
ordered_vector<int> d(s);

代码:

#include<bits/stdc++.h>
using namespace std;
namespace hdk{
	template<typename T>
	class ordered_vector{
		private:
			std::vector<T>v;
		public:
			ordered_vector(vector<T> x={}){
				v=x;
			}
			inline void clear(){
				v.clear();
			}
			inline int lower_bound(T x){
				int loc=std::lower_bound(v.begin(),v.end(),x)-v.begin();
				return loc;
			}
			inline int upper_bound(T x){
				int loc=std::upper_bound(v.begin(),v.end(),x)-v.begin();
				return loc;
			}
			inline void insert(T x){
				v.insert(v.begin()+lower_bound(x),x);
			}
			inline void remove(T x){
				int pos=lower_bound(x);
				if(pos!=v.size() and v[pos]==x) v.erase(v.begin()+pos);
			}
			inline void remove_all(T x){
				while(1){
					int pos=lower_bound(x);
					if(pos==v.size()) break;
					if(v[pos]!=x) break;
					v.erase(v.begin()+pos);
				}
			}
			inline std::vector<T> it(){
				return v;
			}
			T operator [](int x){
				if(x==-1) return -1;
				return v[x];
			}
			inline void remove_larger(int x,bool include_this=false){
				int pos=upper_bound(x);
				for(int i=v.size()-1;i>=pos;--i){
					v.erase(v.begin()+i);
				}
				if(include_this) remove_all(x);
			}
			inline void print(char devide=' ',char ending='\n'){
				for(T i:v) cout<<i<<devide;
				cout<<ending;
			}
			inline void remove_smaller(int x,bool include_this=false){
				int pos=lower_bound(x);
				for(int i=pos-1;i>=0;--i){
					v.erase(v.begin()+i);
				}
				if(include_this) remove_all(x);
			}
			inline int findpre(T x){
				int pos=lower_bound(x)-1;
				if(pos<0) return -1;
				return pos;
			}
			inline int findnext(T x){
				int pos=upper_bound(x);
				if(pos>=v.size()) return -1;
				return pos;
			}
			inline T nearestabs(T x){
				int p=findpre(x),n=findnext(x),ans=0x7fffffff;
				if(p>=0) ans=min(ans,x-v[p]);
				if(n>=0) ans=min(ans,v[n]-x);
				return ans;
			}
			inline T remove_nearestabs(T x){
				if(v.empty()) return 0;
				int p=findpre(x),n=findnext(x),ans=0x7fffffff;bool isp=0;
				if(p>=0) if(x-v[p]<ans) ans=x-v[p],isp=1;
				if(n>=0) if(v[n]-x<ans) ans=v[n]-x,isp=0;
				if(isp) v.erase(v.begin()+p);
				else v.erase(v.begin()+n);
				return ans;
			}
			inline int locate_nearestabs(T x){
				if(v.empty()) return -1;
				int p=findpre(x),n=findnext(x),ans=0x7fffffff;bool isp=0;
				if(p>=0) if(x-v[p]<ans) ans=x-v[p],isp=1;
				if(n>=0) if(v[n]-x<ans) ans=v[n]-x,isp=0;
				if(isp) return p;
				else return n;
			}
			inline int count(T x){
				int b=lower_bound(x),e=upper_bound(x);
				return e-b;
			}
			inline bool find(T x){
				return count(x);
			}
			inline bool empty(){
				return v.empty();
			}
			inline int size(){
				return v.size();
			} 
	};
}
using namespace hdk;

标签:ordered,int,pos,remove,bound,vector,inline,hdk
From: https://www.cnblogs.com/HaneDaCafe/p/18283389

相关文章

  • 关于自定义unordered_set\unordered_map中Hash和KeyEqual:函数对象和lambda表达式简单
    以unordered_set为例,首先在cppreference中查看其模板定义:可以看到Hash类默认是std::hash<Key,KeyEqual类似,本文将Hash以函数对象写出,将KeyEqual以lambda写出。classhashvec{ public: size_toperator()(constvector<int>&vec)const{ returnhash<int>()(vec[0])+hash......
  • Vector底层结构和代码解析
    基本介绍定义说明publicclassVector<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{Vector底层是一个对象数组,protectedObject[]elementData;Vector是线程同步的(线程安全),Vector类的操作方法带有synchronized......
  • 深入解析C++标准库中的std::vector容器
    1.底层实现std::vector 是C++标准库中的一个模版类,用于动态数组。它的底层实现可以理解为一个动态分配的连续内存块,当需要更多空间时,内存会自动扩展。内存分配:vector 使用一块连续的内存存储元素。当插入新元素导致容量不足时,vector 会分配一块更大的内存(通常是当前容量......
  • C++ 关联容器使用 map, unordered_map, set, unordered_set, multiset, unordered_mul
    关联容器是否有序是否关联值是否可重复访问时间set是否否对数map是是否对数multiset是否是对数multimap是是是对数unordered_map否是否常数unordered_set否否否常数unordered_multiset否否是常数unordered_multimap否是是常数#include<map>#include<set>#includ......
  • C++入门 vector深度剖析及模拟实现
    目录vector析构函数模拟实现vector赋值拷贝模拟实现vector拷贝构造模拟实现vector构造函数模拟实现类模板的成员函数n个val构造单参数和多参数对象隐式类型转换使用memcpy拷贝问题在上两篇有关vector的模拟实现中,还有构造,拷贝构造,赋值拷贝以及析构函数没有实现,本篇主......
  • 一分钟轻松掌握Java的Vector&ArrayList
    Vector方法是同步的,线程安全ArrayList方法是非同步的,效率较高向量变量的声明格式Vector<向量元素的数据类型>变量名;示例Vectorvs;创建向量实例对象Vectorvs=newVector();在Java中,Vector<Object>是一个泛型Vector,它专门用于存储Object类型或其子类型的对象......
  • vector oj题 和 位运算
    知识点1:lowbit(x)        简介:众所周知,lowbit()操作是算法竞赛中的高级技巧,特别是高级数据结构,线段树的核心,还有什么二进制与位运算题目,而本文就用最通俗易懂的话,来教会大家lowbit的含义。        含义:lowbit(x)是x的二进制表达式中最低位的1所对应的值。......
  • vector中下标[]操作、迭代器与size()在使用中遇到的问题
    综述:1.今天学习vector的过程中遇到的一些问题记录下来,方便日后复习以及有相同疑惑的同学参考。2.主要关于下标与迭代器写入与读取元素。遇到的问题:代码如下:#include<iostream>#include<vector>usingnamespacestd;intmain(){ unsignedinti; vector<int>v1;......
  • 【C++】vector的使用和模拟实现
    ❤️欢迎来到我的博客❤️前言vector示可变大小数组的序列容器就像数组一样,vector也采用的连续存储空间来存储元素既然都是数组并且都可以动态增长那么vector能不能替代string呢?答案是不能原因如下:string和vector在结构上有所不同不同点:string要求末尾有’\0’(自动......
  • vector的特性及使用
    1、 vector的定义:单独定义一个vector的形式为:vector<typename>vector; 1.如上定义其实相当于一个大小可变化的序列容器,即变长数组。2.vector采用连续的储存空间来储存元素,意味着可以通过下标来访问元素,和数组一样高效,但是又比数组更优秀,它的大小是可以动态改变的,而且......