功能:

  1. 已重载[]运算符
  2. 已重载+运算符(合并)
  3. 已重载+=运算符
  4. 已重载构造函数
  5. clear()
  6. it() 以std::vector形式返回自身
  7. print(char=' ',char='\n') 输出,第一个参数为分隔符,第二个参数为结束符
  8. count(x) 查找x的出现次数
  9. find(x) 判断x是否出现,是返回1,否则返回0
  10. empty() 判断当前是否为空
  11. size() 返回当前元素个数
  12. lower_bound(x) 查找第一个大于等于x的位置,返回其下标
  13. upper_bound(x) 查找第一个大于x的位置,返回其下标
  14. insert(x) 插入一个元素x
  15. remove(x) 删除一个等于x的元素,未找到则不执行
  16. remove_all(x) 删除所有等于x的元素
  17. remove_smaller(x,bool=false) 删除全部小于x的元素 (bool=true 时为小于等于)
  18. remove_larger(x,bool=false) 删除全部大于x的元素 (bool=true 时为大于等于)
  19. findpre(x) 寻找小于x的最近元素,返回其下标,或者返回-1
  20. findnext(x) 寻找大于x的最近元素,返回其下标,或者返回-1
  21. nearestabs(x) 寻找x与当前所有元素之差的最小值,不存在则返回0
  22. remove_nearestabs(x) 寻找x与当前所有元素之差的最小值,并将其删除,不存在则返回0
  23. locate_nearestabs(x) 寻找x与当前所有元素之差的最小值,返回其下标,或者返回-1
  24. find_maxnum(x) 寻找第x大的数,返回其值,或者返回-1
  25. find_minnum(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;
inline void push_back(T x){
v.push_back(x);
}
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();
}
inline int find_maxnum(int rank){
if(rank>v.size() or rank<1) return -1;
return v[v.size()-rank];
}
inline int find_minnum(int rank){
if(rank>v.size() or rank<1) return -1;
return v[rank-1];
}
ordered_vector<T> operator +(ordered_vector<T> x){
ordered_vector<T> ans;
int i=0,j=0;
while(i<size() and j<x.size()){
if(v[i]<x[j]){
ans.push_back(v[i]);
i++;
}
else{
ans.push_back(x[j]);
j++;
}
}
while(i<size()){
ans.push_back(v[i]);
i++;
}
while(j<x.size()){
ans.push_back(x[j]);
j++;
}
return ans;
}
void operator +=(ordered_vector<T> x){
*this=(*this)+x;
}
};
}
using namespace hdk;

[namespace hdk] ordered_vector的更多相关文章

  1. springcloud必知功能使用教程

    springcloud Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路 ...

  2. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  3. C++ namespace

    namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...

  4. C++ 之namespace常见用法

    一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...

  5. using namespace std 和 using std::cin

    相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...

  6. Why Namespace? - 每天5分钟玩转 OpenStack(102)

    上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...

  7. struts2中错误There is no Action mapped for namespace [/] and action name [] associated with context path

    1 There is no Action mapped for namespace [/] and action name [] associated with context path [/Stru ...

  8. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  9. AMD and CMD are dead之Why Namespace?

    缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...

  10. 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法

    这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...

随机推荐

  1. elasticdump数据迁移与内外网安装

    elasticdump数据迁移与内外网安装 一.安装node 首先获取安装包 wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64 ...

  2. scratch少儿编程卡通三国背景72张全套素材包【免费下载】

    scratch卡通三国题材背景图片,共72张,让你轻松打造scratch三国世界! 免费下载地址:https://www.xiaohujing.com.cn 这套背景图片以卡通风格呈现,色彩鲜艳.造型 ...

  3. oracle数据库状态查询

    oracle数据库状态查询(表空间,表空间利用率,是否自动扩展,IOPS,MBPS,数据库总大小) 排除了('SYSAUX', 'USERS', 'SYSTEM','UNDOTBS1') 结果示例 - ...

  4. 安卓开发(java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.view.View...)空指针异常

    无论是初学者还是做开发很久的人都会遇到这个问题,那就是空指针异常: 遇到这种情况我们首先不要惊慌,一般这个问题都不是很大的问题,只需要我们 静下心来慢慢的查找,下面分成几步来带你查找问题: 1:首先是 ...

  5. OpenCV计算机视觉学习(16)——仿射变换学习笔记

    如果需要其他图像处理的文章及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractic ...

  6. 创绘-AI一键小说转漫画视频

    创绘-AI一键小说转漫画视频 创绘简介 一键智能AI推理提示词,自动关联上下文,画面匹配度更高 一键批量绘图,同时支持本地和云端模式(没有显卡也能畅享绘图) 一键导出剪映草稿,自动生成关键帧,快速图文 ...

  7. Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition

    GitHub地址: https://github.com/mit-han-lab/efficientvit#usage 相关: https://www.jetson-ai-lab.com/vit/tu ...

  8. python高性能计算:cython使用openmp并行(示例)

    y.pyx import cython from cython import parallel from cython.parallel import prange cdef int i cdef i ...

  9. 深度神经网络:深度神经网络部署工程师——必备工具分享:onnx_simplifier、OnnxSlim

    onnx_simplifier 地址: https://github.com/daquexian/onnx-simplifier OnnxSlim 地址: https://github.com/WeL ...

  10. 讲师招募 | Apache SeaTunnel Meetup等你来秀!

    2024年第三季度已经悄然开启,猛回头才发现今年的时日竟然已经过半!这半年又是在忙忙碌碌中度过,好在看着社区发展年中汇总的一串串数字,似乎都在预示着社区将在一条正确的轨道上,朝着好的方向继续发展.但又 ...