Java和C++的一些常用区别及联系

文章介绍了如何在Java和C++中使用堆数据结构,如优先队列,解决区间排序问题,以及键值对的存储与操作,如C++的map实现。主要涉及一对区间排序和堆的使用,包括小顶堆和大顶堆的创建及操作。
摘要由CSDN通过智能技术生成

一、一对数(l,r)排序(java,c++)

 Java:如例题所示

题目:

给定 N 个闭区间 [ai,bi,请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。

输出最小组数。

输入格式

第一行包含整数 N,表示区间数。

接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示最小组数。

import java.util.*;
import java.io.*;

public class Main{

    static class Edge{
        int l;  
        int r;    
        public Edge(int l,int r){
            this.l = l;   
            this.r = r;   
        }
    }
    static List<Edge> edges;
    static int n;
    static BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException{
        String[] s = cin.readLine().split("\\s+");
        n = Integer.parseInt(s[0]);
        edges = new ArrayList<>();
        for(int i = 0; i < n; i++){
            String[] s1 = cin.readLine().split("\\s+");
            int l = Integer.parseInt(s1[0]);
            int r = Integer.parseInt(s1[1]);
            edges.add(new Edge(l, r));
        }

        //按左端点进行排
        edges.sort((e1, e2)-> e1.l - e2.l);
        //通过minHeap维护每组的尾端
        Queue<Integer> minheap = new PriorityQueue<Integer>();
        for(int i = 0; i < n; ++i){
            int l = edges.get(i).l;
            int r = edges.get(i).r;
            //判断:任意组中右端点的最小值的组 >= 当前区间的的左端点L:新组
            if(minheap.isEmpty() || minheap.peek() >= l){
                minheap.add(r);
            }else{
                //可加入到老组中update 老组的 max r
                int max_r = minheap.poll();
                minheap.add(Math.max(max_r, r));
            }
        }
        System.out.print(minheap.size());
    }
}

C++:operator重写

下例是升序

struct Range
{
    int l,r;
    bool operator< (const Range &W)const
    {
        return r<W.r;
    }
}ranges[N];

二、堆的用法

Java:PriorityQueue

默认情况下,PriorityQueue 创建的是小顶堆,但是可以通过传递一个自定义的比较器来创建大顶堆。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 创建小顶堆
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        minHeap.add(3);
        minHeap.add(1);
        minHeap.add(2);
        System.out.println("Min heap:");
        while (!minHeap.isEmpty()) {
            System.out.print(minHeap.poll() + " ");
        }
        System.out.println();
        
        // 创建大顶堆
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
        maxHeap.add(3);
        maxHeap.add(1);
        maxHeap.add(2);
        System.out.println("Max heap:");
        while (!maxHeap.isEmpty()) {
            System.out.print(maxHeap.poll() + " ");
        }
        System.out.println();
    }
}

C++:priority_queue

默认情况下,std::priority_queue 创建的是大顶堆,但是可以通过传递一个自定义的比较器来创建小顶堆。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
    // 创建小顶堆
    priority_queue<int, vector<int>, greater<int>> minHeap;
    minHeap.push(3);
    minHeap.push(1);
    minHeap.push(2);
    cout << "Min heap:" << endl;
    while (!minHeap.empty()) {
        cout << minHeap.top() << " ";
        minHeap.pop();
    }
    cout << endl;
    
    // 创建大顶堆
    priority_queue<int> maxHeap;
    maxHeap.push(3);
    maxHeap.push(1);
    maxHeap.push(2);
    cout << "Max heap:" << endl;
    while (!maxHeap.empty()) {
        cout << maxHeap.top() << " ";
        maxHeap.pop();
    }
    cout << endl;

    return 0;
}

三、键值对

c++:map

map<int, int> stu;
stu.insert(pair<int, int>(i, j));
auto it_find = stu.find(f);//it_find是迭代器:map<int,int>::iterator
if (it_find!=stu.end()) {.....}

JAVA:HashMap

import java.util.HashMap; // 引入 HashMap 类
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
        Sites.put(1, "Google");
        Sites.put(2, "Runoob");
        Sites.put(3, "Taobao");
        Sites.put(4, "Zhihu");
//使用get()方法来通过key访问value
System.out.println(Sites.get(3));

//删除元素
 Sites.remove(4);

//删除所有键值对(key-value)可以使用 clear 方法:
Sites.clear();

//如果要计算 HashMap 中的元素数量可以使用 size() 方法:

//迭代遍历
// 输出 key 和 value
        for (Integer i : Sites.keySet()) {
            System.out.println("key: " + i + " value: " + Sites.get(i));
        }
        // 返回所有 value 值
        for(String value: Sites.values()) {
          // 输出每一个value
          System.out.print(value + ", ");
        }

### 回答1: C和Java有很多不同之处,C是一种底层编程语言,它更加关注程序的性能和效率,而Java是一种高级编程语言,它更注重程序的安全性和可移植性。此外,C语言使用指针来实现动态内存分配,而Java不使用指针,而是使用垃圾回收机制来管理内存。 ### 回答2: C是一种面向过程的编程语言,而Java是一种面向对象的编程语言。C语言主要用于系统级编程,例如操作系统和嵌入式系统的开发。它的语法简洁、执行效率高,但对于程序员而言,使用C编程需要自己管理内存,包括分配和释放等操作。 相比之下,Java更注重于开发大型应用程序和跨平台应用。使用Java编程时,程序员可以利用面向对象的特性,例如封装、继承和多态,更方便地组织代码和实现复杂的系统。而且,Java的内存管理由垃圾回收机制自动处理,减轻了程序员的负担。 另外,C语言的代码可移植性较差,同一份代码需要根据不同的操作系统和硬件平台进行修改。而Java通过Java虚拟机(JVM)实现了跨平台性,一次编译后的Java代码可以在不同的系统上运行。这降低了开发者的开发和维护成本。 虽然Java拥有许多方便的特性,但它的执行效率通常较C语言慢一些。因此,在需要高性能的应用场景,如游戏开发或者操作系统内核开发时,C语言仍然是更好的选择。 总而言之,C和Java都是常用的编程语言,有各自的适用场景。C适用于系统级编程和对效率要求较高的场景,而Java适用于大型应用程序和跨平台开发。 ### 回答3: C语言和Java语言是两种不同的编程语言,在很多方面存在着区别。 首先,C语言是一种过程式编程语言,而Java是一种面向对象编程语言。C语言注重于程序的过程和函数的设计,而Java更注重于对象的封装、继承和多态性。Java具有更丰富的面向对象特性,使得代码更易于维护和扩展。 其次,C语言是编译型语言,而Java是解释型语言。C语言的源代码需要通过编译器转换为机器语言后才能执行,而Java通过JVM(Java Virtual Machine)解释执行字节码。这使得Java具有更好的跨平台性,可以在不同的操作系统上运行,而C语言需要为不同的操作系统编写特定的代码。 另外,C和Java在内存管理方面也有差异。C语言程序员需要手动管理内存分配和释放,容易出现内存泄漏和悬挂指针等问题,而Java具有垃圾回收机制,可以自动回收不再使用的对象,减少内存问题。 在语言的应用领域上,C语言更适合系统级编程和嵌入式开发,如操作系统和驱动程序等;而Java更适合于开发大型应用程序和网络应用,如企业级应用和Web应用等。 总之,虽然C和Java在语法和一些基本概念上有相似之处,但它们的设计理念和应用领域不同。选择何种语言应根据具体的需求和目标来决定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值