C++与Java的API对比(集合操作等方面)
转载请注明出处(~ ̄▽ ̄)~
个人第一篇博客,觉得不错就点个“推荐”吧 φ(゜▽゜*)♪
虽然自己是先学的C++,再学的Java,但是相对而言,自己写Java比写C++要相对多一些。参加算法竞赛时起初也是更加喜欢使用Java(毕竟没有奇奇怪怪的段错误),但是愈发感觉国内算法竞赛(其实哪里都是)对C++以外的语言还是不太友好的,所以在此做一个简单的总结,把一些常用操作做一个对比。(以方便被打压的Java选手转型C++)
一维数组初始化
Java
int[] arr = new int[len]; // len代表长度,在下文可能会有不少这类的默认变量
int[] arr = {1,2,3};
int[] arr = new int[]{1,2,3};
C++
int *pia = new int[10]; // 每个元素都没有初始化
int *pia2 = new int[10] (); // 每个元素初始化为0
string *psa = new string[10]; // 每个元素调用默认构造函数初始化
string *psa = new string[10](); // 每个元素调用默认构造函数初始化
char *cp = new char[len];
delete [] cp;
int value[100] = {1,2}; // value[0]和value[1]的值分别为1和2,而没有定义的value[i>1]则初始化为0
二维数组初始化
Java
//Java的二维数组不一定需要是一个矩阵
int[][] arr = new int[len][len];
String[][] arr = new String[len][len]; //非基本类型还需对每个元素单独进行new
C++
int value[9][9]; // value[i][j]的值不定,没有初始化
int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其他初始化为0
int (*value)[n] = new int[m][n];
delete []value; // n必须为常量,调用直观。未初始化
int** value = new int* [m];
for(int i=0;i<m;++i) value[i] = new int[n];
for(int i=0;i<m;++i) delete []value[i];
delete []value; // 多次析构,存储麻烦,未初始化
多维数组初始化:
Java
同于二维
C++
int arr[1][2][3];
int arr[1][2][3] = {{1}};
数组初始化(使用函数)
Java
Arrays.fill(arr,0);
C++
memset(arr,0,sizeof(arr)) //memset用于对连续内存进行初始化,更快
fill(arr,arr+len,0)
集合类及操作
列表
Java
List<Integer> l = new ArrayList<Integer>();
List<Integer> l = new LinkedList<Integer>();
l.add(e);
l.add(ind,e);
l.addAll(ll);
l.get(ind);
l.indexOf(e);
l.isEmpty();
l.remove(ind);
l.set(ind,e);
l.size();
l.clear();
C++
vector<int> a ; //声明一个int型向量a
vector<int> a(10) ; //声明一个初始大小为10的向量
vector<int> a(10, 1) ; //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
vector<vector<int>> vec(row,vector<int>(col,0));
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
a.emplace_back(e);// emplace_back为C++ 11的函数,若不支持可以使用push_back
a.emplace(a.begin()+4, e);
dest.insert(dest.end(), src.begin(), src.end());
a[ind];
find(a.begin( ), a.end( ), e ); //没找到则返回a.end()
a.empty();
a.erase(ind);
a.erase(first,last);
a[ind]=e;
a.size();
a.clear();
集合
Java
Set<Integer> s = new HashSet<Integer>();
Set<Integer> s = new TreeSet<Integer>();
s.add(e);
s.addAll(ss);
s.contains(e);
s.isEmpty();
s.remove(e);
s.size();
s.clear();
C++
unordered_set<int> s;
unordered_set<string> myset = {"yellow","green","blue"};
s.insert(e); //也可范围插入
s.find(e); //没找到则返回s.end()
s.empty();
s.earse(e);
s.size();
s.clear();
Map
Java
Map<Integer,Integer> map = new HashMap<>();
map.put(1,1);
map.containsKey(k);
map.containsValue(v);
map.get(k);
map.isEmpty();
map.remove(k);
map.size();
C++
unordered_map<string,double> map;
pair<string,double> myshopping ("baking powder",0.3);
//pair只有两个值,而tuple可以支持多个值
//tuple<int,int,int> t(1,1,1);
//get<ind>(t);
//make_tuple<int,int,int>(1,1,1);
map.insert (myshopping); // 复制插入
map.insert (make_pair<string,double>("eggs",6.0)); // 移动插入
map.insert (mypantry.begin(), mypantry.end()); // 范围插入
map.insert ({{"sugar",0.8},{"salt",0.1}}); // 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
map["coffee"] = 10.0; //数组形式插入
map.count(k); //为1则是有,为0则是没有
map.find(k); //返回map.end()则是没有
map.empty();
map.earse(k);
map.size();
队列
Java
Queue<Integer> q = new LinkedList<>();
q.add(e);
q.poll();
q.peek();
q.isEmpty();
q.size();
C++
queue<string> q;
q.emplace(e);
q.front();
q.pop();
q.empty();
q.size();
双向队列
Java
Deque<Integer> q = new ArrayDeque<>();
q.addFirst(e);
q.addLast(e);
q.getFirst(e);
q.getLast(e);
q.peekFirst(e);
q.peekLast(e);
q.removeFirst(e);
q.removeLast(e);
q.isEmpty();
q.size();
C++
deque<int> q;
q.emplace_front(e);
q.emplace_back(e);
q.pop_front(e);
q.pop_back(e);
q.assign(beg,end); //区间赋值
q.empty();
q.size();
栈
Java
推荐使用Deque
C++
stack<int> s;
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值
s.emplce(); //将元素压入栈顶
堆
Java
Queue<Integer> q = new PriorityQueue<>();
//其余方法同于队列
C++
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
//对于基础类型 默认是大顶堆
priority_queue<int> q;
//除了q.top()才是访问队列首元素,其他方法保持与队列一致
类型转换
Java
//基本类型转化为字符串
String.valueOf()
//字符串转基本类型
XXX.parseXXX()
C++
//基本类型转化为字符串
to_string (val);
std::stringstream ssTemp;
ssTemp<<5;
std::string strDst=ssTemp.str();
//字符串转基本类型
stoi()、stol()、stoll()、atof()
int a = 0;
char *strData = "123";
stringstream stream(strData );
stream>>a;
文件操作与重定向
Java
//保存最原始的输入输出流
InputStream in = System.in;
PrintStream out = System.out;
System.setIn(new FileInputStream("in.txt"));
System.setOut(new PrintStream("out.txt"));
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"),"UTF-8"));
PrintWriter pw = new PrintWriter("text.txt");
C++
ifstream fin("test.dat");
ofstream fout("test.dat");
streambuf * backup;
ifstream fin;
ofstream fout;
fout.open("data.txt");
backup = cout.rdbuf();
cout.rdbuf(fout.rdbuf());
cout.rdbuf(backup);
如有错误,还望不吝指出。
转载请注明出处(~ ̄▽ ̄)~
C++与Java的API对比(集合操作等方面)的更多相关文章
- JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点
整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有 ...
- java中的集合操作类(未完待续)
申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...
- java的list集合操作List<T>转化List<Long>
java的list集合操作List<T>转化List<Long> package com.google.common.collect; import com.google.co ...
- JAVA集合操作的利器:CollectionUtils
使用 CollectionUtils 中四个方法之一执行集合操作.这四种分别是 union(),intersection();disjunction(); subtract(); 下列例子就是演示了如 ...
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...
- Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap
概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...
- 2018.6.19 Java核心API与高级编程实践复习总结
Java 核心编程API与高级编程实践 第一章 异常 1.1 异常概述 在程序运行中,经常会出现一些意外情况,这些意外会导致程序出错或者崩溃而影响程序的正常执行,在java语言中,将这些程序意外称为异 ...
- JAVASE02-Unit05: 集合操作 —— 查找表
Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * ...
- Java 2D API - 1. 基本概念
Java 2D API扩展AWT包,对二维图形.文本及成像功能提供了支持,可用于开发复杂的界面.绘图软件和图像编辑器.Java 2D对象位于用户坐标空间(User coordinate space), ...
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...
随机推荐
- ModelAndView方法的返回值类型
一.ModelAndView @RequestMapping("/selectById") public ModelAndView queryById(Integer id){ M ...
- C# 从0到实战 命名空间
什么是命名空间 命名空间是C#为了解决类名冲突而产生的一种方案,通过特定的前缀来标识一个类,使得编程者可以在自己的命名空间中自由使用各种类名,这很类似于Java中的包. 一般新手学习C#都会使用一个 ...
- Vue中使用Echarts 脱坑
1. 数据问题,不像官方实例所提供的数据直接写在options对应的数据源里,开发中应当是后端接口请求过来的数据,一般来说,会将echarts图标抽成组件的形式,需要的数据源通过父组件传给子组件,但是 ...
- day10-好友关注
功能05-好友关注 6.功能05-好友关注 6.1关注和取关 6.1.1需求分析 在探店图文的详情页面中,可以关注发布笔记的作者: 关注和取关:点击关注按钮就会发出请求(上图):http://127. ...
- 2020-09-25:rust中Point是结构体类型,【let p1=Point{x:25,y:25};let p2=p1;】请问p1和p2是同一个对象吗?
福哥答案2020-09-25:#福大大架构师每日一题# 不是同一个对象.p1和p2直接存内容,不存地址.这点跟java里的new对象是不一样的.p1.x和p1的地址相同,说明p1存的是内容,而不是地址 ...
- 2020-10-30:给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?
福哥答案2020-10-30:1.双重遍历法.2.一次遍历法.golang代码如下: package main import "fmt" const INT_MAX = int(^ ...
- 2020-11-23:go中,s是一个字符串,s[0]代表什么?是否等于固定字节数?
福个答案2020-11-23:Golang 的字符串(string)是合法的 UTF-8 序列,这就涉及到了两种不同的遍历方式,一种是按照 Unicode 的 codepoint 遍历,另一种是把 s ...
- 2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样。
2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样. ...
- openstack部署2
检查服务,查看dashboard页面有哪些功能 检查服务状态 检查计算节点,控制节点服务是up状态 检查网络节点是True的状态.这里的每个计算节点,都是一个neutron的客户端. 查看dashbo ...
- MySQL-DQL
准备测试表,先跟着执行下面的SQL #1.登录MySQL后 #2.创建test_database数据库,不存在则创建 create database if not exists test_databa ...