C++でstd::map
のクラスを実装し、SWIGを使用してJavaからコールするインターフェイスを作成しました。しかし、イテレータオブジェクトがないので、SWIGのエントリを繰り返し処理することができます。std::map
。誰もイテレータを作成する方法を知っていますか?C++のstd :: mapでSWIGを使用する場合、Javaのイテレータはありません
答えて
Javaでオブジェクトを反復処理できるようにするには、Iterable
を実装する必要があります。これには、Iterator
の適切な実装を返すiterator()
というメンバ関数が必要です。
マップからどのタイプを使用しているのか、ペア(C++の場合のように)、キーまたは値を繰り返し処理できるようにしたいのかどうかは疑問です。 3つの変形に対する解決法は実質的に同様であり、以下の例では値を選択した。最初
まず、物事、私はこれをテストするために使用SWIGインタフェースファイルのためのプリアンブル:反復可能なマップを実現するために
%module test
%include "std_string.i"
%include "std_map.i"
私は、宣言に定義され、SWIGインタフェースファイル内の別のクラスをラップしました。このクラスのMapIterator
は、Iterator
インターフェイスを実装しています。これは、JavaとラップされたC++が混在していて、他のものよりも簡単に書くことができます。まずタイプマップとして与えられたいくつかのJava、それは実装インタフェースとIterable
インターフェイスに必要な3つの方法の2つを与えるタイプマップ、:
%typemap(javainterfaces) MapIterator "java.util.Iterator<String>"
%typemap(javacode) MapIterator %{
public void remove() throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}
public String next() throws java.util.NoSuchElementException {
if (!hasNext()) {
throw new java.util.NoSuchElementException();
}
return nextImpl();
}
%}
はその後、我々はプライベートを持っているC++ MapIterator
の一部を供給next()
の例外をスローする例外を除くすべての実装と、イテレータに必要な状態(std::map
自身のconst_iterator
の表現で表されます)。
%javamethodmodifiers MapIterator::nextImpl "private";
%inline %{
struct MapIterator {
typedef std::map<int,std::string> map_t;
MapIterator(const map_t& m) : it(m.begin()), map(m) {}
bool hasNext() const {
return it != map.end();
}
const std::string& nextImpl() {
const std::pair<int,std::string>& ret = *it++;
return ret.second;
}
private:
map_t::const_iterator it;
const map_t& map;
};
%}
は最後にstd::map
我々がIterable
インタフェース実装をラップしていることをSWIGを伝え、私達はちょうど書いたMapIterator
クラスの新しいインスタンスを返しますstd::map
をラップする目的のために、余分なメンバ関数を提供する必要があります。
%typemap(javainterfaces) std::map<int,std::string> "Iterable<String>"
%newobject std::map<int,std::string>::iterator() const;
%extend std::map<int,std::string> {
MapIterator *iterator() const {
return new MapIterator(*$self);
}
}
%template(MyMap) std::map<int,std::string>;
これにより、複数のマップを持っている場合、それはあなたが%template
で行うと同じように、適切なマップのマクロを「呼び出し」の問題だけだようなマップの種類を非表示にするには、例えば、マクロで、より一般的な可能性があり。
プリミティブ型のマップとのわずかな合併症でもあります - あなたがペアをラップすることを決定しない限り、あなたは、(私は信じているオートボクシング用語である)の代わりにdouble
/int
のDouble
/Integer
を使用するJava側の手配をする必要がありますすでにプリミティブメンバーとペアを組むことができます。
- 1. SWIGでPHPのstd :: mapを繰り返し処理する
- 2. STL std :: mapオペレータ[]割り当ての右側にある場合
- 3. SWIG + CMAKE:init関数がありません
- 4. C++ std ::シャッフルランダムではありません
- 5. C++ std :: system 'system' stdのメンバーではありません
- 6. イテレータ(std :: map)はC++でどのように動作しますか?
- 7. std :: map auto balance自体はありません
- 8. C++ 1zでtry_emplace()の代わりにstd :: map :: emplace()を使用する理由はありますか?
- 9. std :: setの代わりにstd :: unordered_setを使用する場合
- 10. 'for_each_n'はC++の 'std'のメンバーではありません。
- 11. std :: mapをstd :: mapのキーとして使用する
- 12. Sming IDE(ESP8266)でstd :: mapを使用する方法はありますか?
- 13. std :: dequeイテレータを避けてくださいunmanaged C++、C++/cliとC#コードの間にエラーがありません
- 14. イテレータは何の理由もありません。C++
- 15. 同じタイプのイテレータを使用している場合、「演算子は一致しません」
- 16. map/iteratorはインクリメンタルマップではありません。インクリメンタルではありません。
- 17. イテレータからstd :: mapの値を変更します
- 18. 2つのstd :: mapの値がお互いのイテレータですか?
- 19. C++のクラッシュstd :: map
- 20. C++ - クラス名をstd :: mapのキーとして使用する方法はありますか?
- 21. TypeError:mysqlを使用している場合、スキーマはコンストラクタではありません
- 22. std :: mapの初期化にC++ 11のconstexprを使用する
- 23. std :: mapクラスのイテレータを定義する方法
- 24. ジュリアのC++スタイルのstd :: mapと同等のものはありますか
- 25. C++ 0xタプルにイテレータはありません。
- 26. CバージョンのC++ std :: map
- 27. C++:std :: map sorting
- 28. anglejsを使用している.mapは関数ではありません
- 29. なぜstd :: map < std::map >はメモリの割り当てを解除しませんか?
- 30. stl :: mapイテレータ使用のCODESONARのバッファオーバーランコメント
「すべて」の項目ではないことを正確に示す必要があります。最後のアイテムが見つからない場合は、具体的なものは何ですか?相互運用性の仕組みを示すコードを共有していますか? –
申し訳ありませんが、正確に言えば、私は反復を全く実行することができません。 – delita
すばらしいGoogle検索でこれが見つかりました:http://chadretz.wordpress.com/2009/11/27/stl-collections-with-java-and-swig/多分役立つでしょう – Tim