2017-07-06 82 views
0

我想將一個程序從Java移植到C++,我似乎無法弄清楚如何將LinkedHashMap轉換爲std :: map。我無法更改LinkedHashMap,但我不受限於std :: map。我需要它產生相同的鍵/值對,但是排序/散列/其他任何其他都不重要。將Java LinkedHashMap轉換爲C++ std :: map

Java代碼轉換:

List<Face> faces = new ArrayList<Face>(modelFull.faces.length); 
Map<Point3D, Integer> map = new LinkedHashMap<Point3D, Integer>(); 
for (int i = 0; i < modelFull.faces.length; i++) { 
    Face f = new Face(modelFull.faces[i]); 
    faces.add(f); 
    for (int k = 0; k < 3; k++) { 
     Point3D p = f.pts[k]; 
     Integer v = map.get(p); 
     if (v == null) { 
      v = 0; 
     } 
     map.put(p, v + 1); 
    } 
} 

我嘗試:

std::map<RVPoint3D, int> pointMap; 
auto modelFaces = modelFull.getFaces(); 
for (const auto &face : modelFaces) 
{ 
    Face newFace = Face(face); 
    for (int k = 0; k < 3; ++k) 
    { 
     RVPoint3D pt = newFace.getPts()[k]; 
     ++pointMap[pt]; 
    } 
    faces.push_back(newFace); 
} 

Java實現創建地圖的尺寸​​7523和C++一個是7967.有檢查總45234個元素所以它似乎是通過潛在的鍵正確迭代。

我不確定該從哪裏出發。我試過重載操作符,自定義比較器,自定義哈希函數等,我必須錯過一些東西。

+3

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然遇到問題,請隨時返回一個[最小,完整且可驗證的示例](http://stackoverflow.com/help/mcve),以說明您的問題。 –

+0

請將解決方案作爲答案發布,而不是作爲問題的更新。這是爲了避免混淆。謝謝。 – Bugs

回答

0

切換到一個無序的地圖,使用AA自定義哈希函數,和重載==操作符的伎倆

auto hashCode = [](const RVPoint3D pt) 
{ 
    return pt.x + pt.y + pt.z; 
}; 

std::unordered_map<RVPoint3D, int, std::function<double(RVPoint3D)>> pointMap{modelFull.getFaces().size(), hashCode}; 

我想我在這個最初的嘗試是不正確的,但不知何故這完美的作品,所以也許這」我會在未來幫助別人。

0

java版本爲您設置v0再加入1到它,當你把它放在地圖上的新地圖項目。 \在C++版本,你只需要把它放入0

的Java

Integer v = map.get(p); 
if (v == null) { 
    v = 0; 
} 
map.put(p, v + 1); // new map entries go in as 1 

C++

if (pointMap.count(pt)) 
{ 
    pointMap[pt] += 1; 
} else { 
    pointMap[pt] = 0; // new map entries go in as 0 
} 

您也可以設置一個nullIteger0在Java中?不要你需要做的是這樣的:

v = new Integer(0); // ? 

側面說明:

C++代碼可以被改寫爲:

for (const auto &face : modelFaces) 
{ 
    Face newFace(face); // Value, no need for Java-like syntax 
    for (int k = 0; k < 3; ++k) 
    { 
     RVPoint3D pt = newFace.getPts()[k]; 
     ++pointMap[pt]; // auto sets to 1 on new entry 
    } 
    faces.push_back(newFace); 
} 

這工作,因爲如果鍵不存在在std::map中,當您使用pointMap[pt]訪問時,會自動創建一個(使用相應的值0)。所以你可以增加,新值將從1開始,就像Java代碼一樣。

+0

C++循環的好處。我原本有類似的東西,但我忘了把它改回來。不幸的是,這可能已經解決了值的問題,但它仍然不能修復地圖中的額外項目。 Java代碼似乎工作正常,所以我不確定將整數設置爲空。我無法控制該代碼,也沒有任何文檔。 – rghamilton3

+0

@ rghamilton3那麼我會假設你的問題在別處。也許你的價值觀來源?你是否餵食你的地圖完全一樣的東西?你可以比較一下*代碼,看看你在'Java'和'C++'之間做了什麼不同的事情。 – Galik

+0

@ rghamilton3你的'Point3D'類整數或浮點數? – Galik