首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ STL 容器到 Java 集合的完整映射指南:map、vector、set 對應實現

     編輯:程式設計綜合問答

背景場景

將 C++ 代碼移植到 Java 時,核心難點在於 STL 容器與 Java Collections Framework 的語義映射。本文針對典型 C++ 數據結構提供完整的 Java 對應實現。

核心容器映射表

C++ STLJava 對應關鍵差異
std::map<K, V>TreeMap<K, V>有序、紅黑樹實現、O(log n)
std::unordered_map<K, V>HashMap<K, V>無序、哈希表、O(1) 平均
std::vector<T>ArrayList<T>動態數組、隨機訪問快
std::list<T>LinkedList<T>雙向鏈表、插入刪除快
std::set<T>TreeSet<T>有序、唯一、紅黑樹
std::unordered_set<T>HashSet<T>無序、唯一、哈希表
std::pair<T1, T2>AbstractMap.SimpleEntry<T1, T2> 或自定義 RecordJava 無內置 Pair,Java 16+ 可用 record Pair<T1,T2>(T1 first, T2 second)

針對題目中的具體結構映射

1. std::map<int, int> → TreeMap<Integer, Integer>

// C++
std::map<int, int> Map;

// Java
Map<Integer, Integer> map = new TreeMap<>();  // 有序
// 或
Map<Integer, Integer> map = new HashMap<>();  // 無序,性能更好

2. std::map<int, Point2d> → Map<Integer, Point2d>

// C++ 結構體
struct Point2d { int x; int y; float SWT; };

// Java 類(使用 Record,Java 16+)
public record Point2d(int x, int y, float SWT) {}

// 或傳統 POJO(兼容性更好)
public class Point2d {
    private int x, y;
    private float SWT;
    // 構造器、getter/setter、toString、equals/hashCode
}

3. std::vector<std::vector<Point2d>> → List<List<Point2d>>

// Java
List<List<Point2d>> components = new ArrayList<>();
// 使用方式
components.add(new ArrayList<>()); // 添加一行
components.get(0).add(new Point2d(1, 2, 3.0f)); // 添加元素

4. typedef std::vector< std::set<int> > graph_t → List<Set<Integer>>

// Java
List<Set<Integer>> graph = new ArrayList<>();
// 圖的鄰接表表示
graph.add(new TreeSet<>()); // 有序集合
graph.add(new HashSet<>()); // 無序集合
graph.get(0).add(1); // 添加邊 0->1

完整可運行示例:JSP 中使用 Map<Integer, Point2d>

Point2d.java (模型類)

package com.example.model;

public class Point2d {
    private int x;
    private int y;
    private float swt;
    
    public Point2d() {}
    public Point2d(int x, int y, float swt) {
        this.x = x; this.y = y; this.swt = swt;
    }
    // Getter/Setter
    public int getX() { return x; }
    public void setX(int x) { this.x = x; }
    public int getY() { return y; }
    public void setY(int y) { this.y = y; }
    public float getSWT() { return swt; }
    public void setSWT(float swt) { this.swt = swt; }
    
    @Override
    public String toString() {
        return String.format("Point2d[x=%d, y=%d, SWT=%.2f]", x, y, swt);
    }
}

MapDemo.jsp (演示頁面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*, com.example.model.Point2d" %>
<html>
<head><title>Java Map 對應 C++ std::map 演示</title></head>
<body>
<h2>Map<Integer, Point2d> 數據展示</h2>
<%
    // 創建並填充 Map(對應 C++ revmap)
    Map<Integer, Point2d> myMap = new TreeMap<>(); // 有序,對應 std::map
    
    myMap.put(1, new Point2d(100, 100, 100.0f));
    myMap.put(2, new Point2d(200, 200, 200.0f));
    myMap.put(3, new Point2d(300, 300, 300.0f));
    
    // 遍歷輸出(對應 C++ 迭代器遍歷)
    int i = 1;
    for (Map.Entry<Integer, Point2d> entry : myMap.entrySet()) {
        Integer key = entry.getKey();
        Point2d point = entry.getValue();
%>
    <div style="margin: 10px; padding: 10px; border: 1px solid #ccc;">
        <strong>第 <%=i%> 個元素</strong><br/>
        Key: <%=key%><br/>
        Value: <%=point%>
    </div>
<%
        i++;
    }
%>
</body>
</html>

關鍵注意事項

  1. 基本類型 vs 包裝類型:Java 泛型不支持基本類型,`Map<int, int>` 必須寫為 `Map<Integer, Integer>`
  2. 有序性選擇:`std::map` 默認有序 → 用 `TreeMap`;`std::unordered_map` → 用 `HashMap`
  3. 對象語義:C++ 結構體是值語義,Java 類是引用語義,注意淺拷貝問題
  4. 迭代器差異:C++ 迭代器類似指針,Java 迭代器是對象,使用 `entrySet()` 或 `forEach`
  5. 內存管理:C++ 需手動管理,Java 依賴 GC,無需 `delete`

進階:圖結構的 Java 實現

public class Graph {
    private final List<Set<Integer>> adjacencyList;
    
    public Graph(int vertexCount) {
        adjacencyList = new ArrayList<>(vertexCount);
        for (int i = 0; i < vertexCount; i++) {
            adjacencyList.add(new HashSet<>());
        }
    }
    
    public void addEdge(int u, int v) {
        adjacencyList.get(u).add(v);
        adjacencyList.get(v).add(u); // 無向圖
    }
    
    public Set<Integer> getNeighbors(int v) {
        return adjacencyList.get(v);
    }
}

總結

C++ STL 到 Java 集合的映射核心在於:

  • 語義對應:有序用 TreeMap/TreeSet,無序用 HashMap/HashSet
  • 類型擦除:Java 泛型運行時擦除,必須使用包裝類型
  • 值 vs 引用:C++ 默認值語義,Java 默認引用語義
  • 標準庫豐富度:Java Collections 缺少 `multimap`、`priority_queue` 等,需自行組合或使用 Guava/Eclipse Collections

掌握這些映射規律,C++ 到 Java 的移植將事半功倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved