問題タブ [const-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.
c++ - 部分定数イテレータを実装する
タイプ K のキーとタイプ V の値を持つハッシュ テーブルのテンプレート クラスを C++11 で実装しています。このテーブルのすべてのコンテンツは に保存されstd::list <std::pair <K,V> >
ます。ここで、クライアントがペアスルーの2番目の要素のみを変更でき、ペアスルーの要素を変更できないように、このテーブルに対してiterator
andを実装したいと思います。const_iterator
iterator
const_iterator
私の最初のアイデアはstd::list <std::pair <const K,V> >
、ストレージとして使用し、このリストの適切な反復子を提供することでした。問題は、このタイプの を宣言し、std::list
常にを返すときです。このメソッドを使用して変換しようとすると、機能しません。libstdc++ では引数としてのみ受け取るためです(libstdc++ のバグです)。だから私はにキャストすることはできません。begin()
end()
const_iterator
iterator
erase
iterator
const_iterator
iterator
そのようなイテレータをどのように実装できますか?
c++ - begin() と end() の const バージョンと非 const バージョンを公開して、スマート ポインターでメンバー ベクトルを反復処理します。
// Cat.h
// main.cpp
CatLibraryで、クライアントが変更可能な Cat を指すスマート ポインターを反復できるnon-const begin()
andを公開したいと考えています。non-const end()
そして、不変のものを指すイテレータconst begin()
をconst end()
返します。
次に、クライアントが const CatLibrary を反復するとき、ライブラリ内の Cat の内容を変更できることを心配する必要はありません。
しかし、const
追加されたメンバー関数begin()
は、ポインターが指す Cat ではなく、ポインターを const ポインターとして修飾するだけです。
ポインターが含まれていない場合、constness を持つベクトルは、反復子が constness を持つ要素を指すようにします。しかし、私はこの効果がスマートポインタが指す要素にも適用されることを望んでいます。
問題を解決するためのアプローチがありますが、将来の使用でどのような問題が発生するかわかりません。
const と nonconst で 2 つのベクトルを維持する
または、この種の constness の問題をベクトルのスマート ポインターで解決する別の解決策はありますか?
c++ - C++ const_iterator 一致するコンストラクターがありません
配列ベースのリスト クラスのカスタム const_iterator ネスト クラスを作成しようとしています。ここにクラスがあります
ただし、ここに示すように、クラスに戻って開始、終了などを行うと、次のようになります。
cbegin と cend で「'ArrayList::const_iterator の初期化に一致するコンストラクターがありません」というエラーが表示されます。おそらく、C++ について理解していないばかげたものであることは承知しています。助けてくれてありがとう!
c++ - イテレータの開始位置の決定
フィールド a と time を持つ、オブジェクトの C++ ベクトル コンテナーを考えてみましょう。現在の時間以降に発生するコンテナー内の最初のアイテムを見つけて (アイテム N と呼びましょう)、特定の値を持つフィールド a を使用して、以前に発生した最初のアイテムからコンテナーを反復処理します (したがって、基本的に、[N-1, inf)) から。プロパティが見つからないと仮定すると、リスト全体に対して 2 回目の反復を実行します。
次のコードは機能しますか? (例では、 >= 5 の最新のアイテムを見つけたいと考えています)。これを行うより良い方法はありますか?
c++ - イテレータ VS const_iterator、distance() で使用
const_iterator と iterator のみの使用についての質問です。より具体的には、distance() を使用します。以下は、ユーザーが (アプリケーションの前の方で) 入力した "fav_games" のリストを作成する基本的なコードです。番号付きリストを出力するために、ベクトルの「インデックス」も削除したかったのです。
部分コード:
私の質問は、「const_iterator」が機能しない理由です。代わりに「iterator」を使用する必要があります。その背後にある「理論」を探しています。"distance()" は "const_iterator" ではなく "iterator" を期待しているように見えます。..どうして?
「const_iterator」を使用した場合のコンパイルエラーを参照してください。
エラー 1 エラー C2782: 'iterator_traits<_Iter>::difference_type std::distance(_InIt,_InIt)': テンプレート パラメーター '_InIt' があいまいです z:\micah\c++\favgames\favgames\favgames.cpp 49 1 favgames
ありがとう!
c++ - `std::string::begin()`/`std::string::end()` によるイテレータの無効化?
begin() const
このコードは、 の結果と の結果を混合しend()
ます。これらの関数のいずれも、反復子を無効にすることは許可されていません。end()
ただし、イテレータ変数を無効にしないという要件がbegin
実際に変数begin
が で使用できることを意味するかどうかは興味がありますend
。
C++98 のコピー オン ライト実装を考えてみましょうstd::string
。これらの関数の結果を使用して文字列を変更できるため、const 以外の関数begin()
と関数によって内部バッファーがコピーされます。end()
したがって、begin
上記は最初は と の両方で有効ですs
がs2
、非 const メンバーを使用すると、それを生成したコンテナーであるend()
に対して有効ではなくなります。s2
上記のコードは、libstdc++ などのコピーオンライト実装で「予期しない」結果を生成します。end - begin
と同じではなくs2.size()
、libstdc++は別の数値を生成します。
begin
有効なイテレータをs2
、それが取得されたコンテナであるから無効にすることは、イテレータを「無効にする」ことになりますか?.end()
イテレータの要件を見ると、 が呼び出された後、このイテレータに対してすべての要件が満たされているように見えるためbegin
、有効なイテレータとしての資格があり、無効化されていない可能性があります。上記のコードは C++98 で適切に定義されていますか? C++11 で、コピー オン ライトの実装を禁止しているのはどれですか?
私自身が仕様を簡単に読んだところ、仕様が不十分であると思われるため、 const バージョンと非 const バージョンを混在させなくても、 と の結果を一緒に使用できるbegin()
という保証はありません。end()
c++ - 通常の反復子 (または同様の範囲/ビュー クラス) は const_iterator から派生する必要がありますか?
通常の反復子 (または同様の範囲またはビュー クラス) を対応する const_iterator から派生させることは良い習慣ですか?
その動機は、
- コードを共有し、
- イテレータ/ビューが大きい場合、変換を回避します。
例として、3D グリッドのビュー、つまりグリッドのセクションを考えてみましょう。1 つのポインタ、3 つのサイズ、および 2 ~ 3 のストライドを含み、合計で 384 バイトになります。
const バージョンと mutating バージョンには、多くの共通機能 (読み取り専用の 3D グリッドで実行できること) があります。
上記の例の反対の動機は、const ビューに const ポインターが含まれているため、変化するビューconst_cast
でそれを使用するか、非 const ポインターに同じアドレスを含む余分なフィールドを追加する必要があることです。