問題タブ [reverse-iterator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
154 参照

c++ - プロキシであるイテレータで逆イテレータを使用するにはどうすればよいですか

事実上プロキシであり、それが返すデータを含む反復子がある場合、逆反復子を作成するにはどうすればよいでしょうか?

逆参照演算子の std::reverse_iterator 実装は、次のようなコードを使用して、デクリメントおよび逆参照する一時オブジェクトを作成します。

その結果、返されるのは、データを取得する前に範囲外になるデータへのポインターです。

これはかなり残念な結果です。

どうすればこれを回避できますか?

0 投票する
3 に答える
174 参照

c++ - オンデマンド イテレータの反転

オンデマンドで値を生成する反復DataIterator子があるため、逆参照演算子は Data& ではなく Data を返します。データDataIteratorをreverse_iteratorでラップして逆にしようとするまで、それは問題ないと思っていました。

上記のコードを実行すると、値が 0 の Data オブジェクトが存在することはわかっていても、まったく見つかりません。述語内にブレークポイントを設定すると、0xCCCC のように予期しない奇妙な値が表示されます (メモリが初期化されていない可能性があります)。何が起こるかというと、reverse_iterator の逆参照演算子は次のようになります (xutility - Visual Studio 2010 より)

最後の行で問題が発生します。一時的なデータが作成され、そのデータへの参照が返されます。参照はすぐに無効になります。

std::find_if の述語を (const Data& 候補) の代わりに (データ候補) を取るように変更すると、述語は機能しますが、未定義の動作で幸運になっていると確信しています。参照は無効ですが、メモリが破壊される前にデータのコピーを作成しています。

私に何ができる?

  1. operator* が Data ではなく Data& を返すように DataIterator を修正しますか? これがどのように可能かはよくわかりません。Data& の代わりに Data を返す DataIterator の全体的なポイントは、非圧縮データ セット全体をメモリに保持する余地がないため、必要に応じて表示する項目を作成することです。 「現在の」データ値を保持することもできますが、DataIterator をインクリメントまたはデクリメントすると、その参照は無効になります。 回答の 1 つを編集 すると、shared_ptr が提案されます
  2. reverse_iterator の特殊化を作成し、その逆参照演算子が参照ではなく値を返すようにしますか? これは苛立たしい量の作業のように思えますが、ここでうまく機能していないのは私の DataIterator であり、STL の残りの部分ではないため、理解できます。
  3. 同様に、おそらく逆方向の find_if を作成します。おそらく、reverse_iterator を特殊化するよりも作業が少なくなります。
  4. 私が考えていなかった他の何か

他の誰かが今から 6 か月後に同じことをしようとしたときに何が問題なのかを理解するために半日吹き飛ばされるのを防ぐために、DataIterator に対してできることはありますか?

0 投票する
1 に答える
335 参照

c++ - STL アルゴリズムの逆反復

引数の 2 つのポインター、配列の先頭と末尾で呼び出される関数があります。私の関数は、条件に一致する要素を終了ポインタから開始ポインタまで検索します。

前方に反復しようとしていた場合、これを行うことができますfind_ifが、逆に反復する必要があります。STLにはこれに対する規定がありますか?

注: これは for ループで簡単に実行できます。私が探しているのは、よりエレガントなソリューションです。

0 投票する
3 に答える
9419 参照

c++ - 逆イテレータからベクトルのインデックスを取得する

ベクトルイテレータから開始イテレータを減算することにより、インデックスを取得する方法を知っています。例えば:

xしかし、今はベクトルの最後のインデックスを見つけたいと思っています。逆イテレータから実際のインデックスを取得するにはどうすればよいですか? うまくいくように見える次のことを見つけました(編集:そうではありません)が、より良い(より慣用的な方法など)方法があるかもしれません。

0 投票する
3 に答える
10551 参照

c++ - std::prev(vector.begin()) または std::next(vector.begin(), -1) を some_container.rend() のように逆の歩哨として使用しても安全ですか?

イテレータを取るコードを書きましたが、逆の順序で比較を行う必要があります。

VS2013 では、デバッグ モードで実行--last != std::prev(seq_begin)すると、デバッガ アサーションがエラー メッセージで失敗します。

しかし、Release モードでは境界チェックがないため、Release モードで実行して正しい結果が得られれば問題ありません。

私の質問は次のとおりです。

  1. std::prev(some_container.begin())歩哨として安全に使用できsome_container.rend()ますか?

  2. reverse_iteratorと を直接比較するにはどうすればよいiteratorですか? 私がコードを書いた場合: std::cout << (std::prev(some_container.begin())==some_container.rend()) << std::endl;コンパイルしてもコンパイルされませんreinterpret_cast

物理的prev(some_container.begin())に等しいかどうか興味がありますか?some_container.rend()

0 投票する
1 に答える
63 参照

c++11 - 奇妙な std::vector::reverse_iterator と文字列の動作

したがって、クラスを介して 2D 値を格納するために使用している線形ベクトルがあります。値を逆に出力したいと思います...つまり、値(0,0)は左下を(max_x,max_y)占め、右上を占めます...典型的なデカルトグリッドのように。これが私のコードです:

注: 文字列を使用せずに直接印刷すると、順序が逆になるだけですべて問題ありません。すべてのメンバー関数が機能するようになり ましたメインコードで、std::fill必要な値でベクトルを埋めるために使用します(クラス関数呼び出し)。次に、いくつかの値を変更します (例: at(0,0)および(max_x,max_y)手動)。(メンバー関数)だから、6x6 = 36サイズのベクトルに2.38を入力してから変更したとします。ここで、アクセスする最初の値 (ベクトルの最後、逆反復子の最初) を 3 に変更し、プログラムを実行します。出力:

それはベクトル全体のサイズです。最初の std::fill 値しか取得できません...何が問題なのですか? []オペレーターを避けたい。

0 投票する
2 に答える
528 参照

c++ - カスタム双方向反復子の reverse_iterator の for_each には OutputIterator が必要です

単純な不変の双方向反復子を作成しました。

operator*() はint referenceではなくintを返すため、反復子は不変です。イテレータが BidirectionalIterator の概念または OutputIterator の概念を満たすかどうかは直交しているため、私の理解ではこれが可能です (4 つの組み合わせすべてが可能です)。

ただし、次のコードではコンパイル時エラーが発生します。

完全なコンテキスト:

それぞれ BidirectionalIterator と InputIterator を必要とする reverse_iterator と for_each 状態に関する cppreference のページ。両方の要件が満たされていると思いますが、stl は依然として逆参照された値を参照に割り当てます。

stl の for_each/reverse_iterator が、OutputIterator である必要のないイテレータに T &operator*() を期待するのはなぜですか?

PS:コメント行は、参照を値で保存する必要があることを示すことで問題を解決できますが、もちろん非常にハックです。

0 投票する
1 に答える
571 参照

c++ - reverse_iterator でユーザー定義イテレーターからすべての関数を継承する

私は C++11 用の JSON クラスを作成しています。 http://github.com/nlohmann/jsonを参照してください。私の中心的なデータ構造は、JSON 値の型 (null、array、object、string、bool、number) を和集合でラップし、Nice C++ インターフェイス経由で提供するクラスです。配列 ( 経由で実装std::vector) とオブジェクト ( ) には独自の反復子が付属しているため、呼び出しをそれぞれのメンバー変数にstd::map委任する「ラッパー」反復子を実装しました。さらに、JSON オブジェクトのキーにアクセスするための 2 つの追加関数と、 へのエイリアスを実装しました。operator++operator->std::string key()reference value()operator*()

これまでのところ、とても良いです (完全なソース コードについては、 https://github.com/nlohmann/json/blob/master/src/json.hppを参照してください)...

reverse_iterator次に、実装したいと思いましたconst_reverse_iterator。そしてここで問題が始まります。

  • using reverse_iterator = std::reverse_iterator<iterator>;と を介してそれらを認識した場合、すべて問題ありませんusing const_reverse_iterator = std::reverse_iterator<const_iterator>;が、関数key()とはまたはオブジェクトでは使用できません。value()reverse_iteratorconst_reverse_iterator
  • reverse_iteratorのような独自のクラスclass reverse_iterator : public std::reverse_iterator<typename basic_json::iterator>を実装すると、クラス全体を再度実装する必要があります。key()との実装を提供するだけでは十分ではありませんが、アダプターを使用して無料で入手したいと思っている と の他のすべてのものvalue()も提供します。operator++()std::reverse_iterator

答えを探すのにかなりの時間を費やしましたが、見つかったすべての参考文献は、不完全なおもちゃの例の表面を引っ掻いたり、反復子は大変な作業であり、Boost に移動する必要があるという結論に達しています...

だからここに私の質問があります:

  1. できるだけ多くの関数を継承するようにreverse_iterator、カスタマイズしたクラスからを作成するにはどうすればよいですか?iterator
  2. 標準のものを超えた動作の継承が自動的に機能しない場合、reverse_iterator完全に繰り返さずに a を作成するにはどうすればよいですか?

どんな助けでも大歓迎です!