2017-07-06 1 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++ 1は7967.の合計を視察45234個の要素があります。ですどちらも、潜在的なキーを通して正しく反復されているようです。

ここからどこに行くのかわかりません。私は演算子、カスタムコンパレータ、カスタムハッシュ関数などをオーバーロードしようとしました。あなたがマップに入れたときに、それに1を追加v0に設定新しいマップの項目のjavaバージョンで

+3

ようこそスタックオーバーフロー!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](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

。 \ 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 
} 

はまた、あなたはJavaで0nullItegerを設定することができますか?あなたのような何かをする必要はありません。

v = new Integer(0); // ? 

側注:

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); 
} 

キーが存在しない場合ので、これは動作します:

C++コードがように書き換えることができますstd::mapには、pointMap[pt]を使用してアクセスすると自動的に(対応する値は0)作成されます。したがって、ちょうど増分することができ、新しい値はJavaコードと同様に1から始まります。 「

+0

C++ループの良いキャッチ私はもともと同様のものを持っていましたが、私はそれを元に戻すのを忘れました残念ながら、それは値の問題を修正したかもしれませんが、それでもマップ内の余分な項目は修正されません。 Javaコードが正常に動作しているように見えるので、Integerをnullに設定するかどうか不安です。私はそのコードとドキュメンテーションを支配しません。 – rghamilton3

+0

@ rghamilton3あなたの問題は他の場所にあると思います。たぶんあなたの価値の源ですか?マップにまったく同じものを供給していますか? * JavaとC++の間で何か違うことをしているのを見る*コードを比較する価値があります。 – Galik

+0

@ rghamilton3あなたの 'Point3D'クラスは整数か浮動小数点ですか? – Galik

関連する問題