問題タブ [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++ - unique_ptrs の STL 回転 const_iterators
unique_ptr の中間で const_iterator で std::rotate を使用すると問題が発生します。
私が試してみました:
これにより、rotate(...iterator, ...const_iterator &, ...iterator) の呼び出しに一致する関数がなくなります。
したがって、私はこれを試しました: std::vector >::const_iterator first = vec.begin(); std::vector >::const_iterator last = vec.end(); std::rotate(最初、中間、最後);
次に、以下に示す一連のエラーメッセージが表示されます。これはバグですか、それとも何かミスをしましたか?
c++ - 因数分解のテクニックは、同じような方法を見つけますか?
私は、メソッドのようなものを因数分解するためのテクニックを探しています。問題は次のとおりです。検索を行うためにコンテナの内容を変更する必要のないコンテナのfindメソッドが必要です。ただし、const_iteratorの代わりにイテレータが返された場合にコンテナが変更される可能性があるため、constバージョンとnon-constバージョンが存在する必要があります。これらの2つのケースでは、コードはまったく同じであり、アクセサーのみがconstXXXまたはXXXに評価され、コンパイラーがその役割を果たします。設計と保守の観点から見ると、これら2つの方法を2回実装するのは賢明ではありません。(そして、そのためにマクロを使用することは本当に避けたいです...)私が意味することは、stl_tree.hのstlのgcc実装からのそのコードによっても非常によく示されています。
メソッドのプロトタイプは異なりますが、実装で記述されたコードは実際には同じであることがわかります。
私は2つの可能な解決策を思いつきました。1つはconst_castを使用する方法で、もう1つはヘルパーテンプレート構造体を使用する方法です。ここでは、これら2つのアプローチの簡単な例を示しました。
これはおそらく非常によく知られている問題であり、C++の第一人者がその問題を修正するための優れたデザインパターンを考え出すかどうかを知りたいと思います。特に、これら2つのアプローチのいずれかで(特にパフォーマンスの観点から)問題が発生したかどうかを知りたいと思います。最初のものははるかに理解しやすいので、特にそれを読んだ後は、それを好むでしょう: 定数とC ++ でのコンパイラの最適化により、const_castを記述してパフォーマンスを損なうことを恐れないようです。
よろしくお願いします、乾杯、
マヌエル
c++ - C++ イテレータから const_iterator へ
C++で(そのコンテナクラスのconst_iterator
)から(あるコンテナクラスの)を取得するにはどうすればよいですか? から はiterator
どうですか?結果はオリジナルと同じ場所を指すはずです。const_iterator
insert_iterator
iterator
c++ - ポインターでconst_iteratorを理解していますか?
const_iteratorの意味を理解しようとしています。次のサンプルコードがあります。
Refresh()
クラス内のメソッドであり、Customer
constとして定義されていません。最初は、const_iteratorがコンテナの要素への変更を許可しないことになっていると思いました。ただし、このコードは文句なしにコンパイルされます。これは、余分なレベルの間接参照が行われているためですか?const_iteratorは正確には何を意味しますか?
アップデート
そして、このような状況では、const_iteratorを使用するのがベストプラクティスですか?
c++ - STL スタイルの反復子を実装し、一般的な落とし穴を回避する方法は?
STL スタイルのランダム アクセス イテレータを提供するコレクションを作成しました。イテレータの実装例を探していましたが、見つかりませんでした。[]
および*
演算子の const オーバーロードの必要性については知っています。イテレータを「STL スタイル」にするための要件と、避けるべきその他の落とし穴 (ある場合) は何ですか?
追加のコンテキスト: これはライブラリ用であり、本当に必要でない限り、依存関係を導入したくありません。私は、同じコンパイラで C++03 と C++11 の間のバイナリ互換性を提供できるように、独自のコレクションを作成します (そのため、壊れる可能性のある STL はありません)。
c++ - c ++stlconstイテレータおよびconstポインタ
このconstキーワードの意味について少し混乱しています私はこのようなクラスを持っています
上記のコードからoper()のconstバージョンをすでに取得しています。したがって、std :: list::iteratorをstd::list::const_iteratorに変更した場合に何が得られるか想像できません。
c++ - const_iterator の奇妙な動作
2 つの const_iterators を作成する疎行列の実装をテストするために、main.cpp を実行しています。
問題は、begin と end を呼び出さないことです (最初の cout も実行しません) が、2 つの反復子を作成すると機能します。const_iterators の begin と end をどのように実装したかを次に示します。
私が気付いた奇妙なことは、SparseMatrix のクラス メソッド内に 2 つの const_iterators を作成すると、それらが機能することです。
c++ - Valgrind は const-iterator が初期化されていないスペースにアクセスしようとしていると言っていますが、実際にはそうです
const_iterators を使用して、要素 (行列の要素) のリストを調べようとしています。
しかし、valgrind が報告しているように、何か問題があります。
==4662== サイズ 8 の初期化されていない値の使用
==4662== at 0x403A19: SparseMatrix::findRow(int) const (SparseMatrix.h:120)
==4662== by 0x40431A: SparseMatrix::findNext(el const*) const (SparseMatrix.h:439)
==4662== by 0x4030B3: SparseMatrix::const_iterator::operator++() (SparseMatrix.h:593)
==4662== by 0x401D63: メイン (main.cpp:121)
==4662==
==4662== サイズ 4 の無効な読み取り
==4662== at 0x403A27: SparseMatrix::findRow(int) const (SparseMatrix.h:123)
==4662== by 0x40431A: SparseMatrix::findNext(el const*) const (SparseMatrix.h:439)
==4662== by 0x4030B3: SparseMatrix::const_iterator::operator++() (SparseMatrix.h:593)
==4662== by 0x401D63: メイン (main.cpp:121)
==4662== アドレス 0xa680020611a25ff は、スタック、malloc、または (最近) 解放されていません
==4662==
==4662==
==4662== シグナル 11 (SIGSEGV) のデフォルト アクションで終了するプロセス
==4662== 一般保護違反
==4662== at 0x403A27: SparseMatrix::findRow(int) const (SparseMatrix.h:123)
==4662== by 0x40431A: SparseMatrix::findNext(el const*) const (SparseMatrix.h:439)
==4662== by 0x4030B3: SparseMatrix::const_iterator::operator++() (SparseMatrix.h:593)
==4662== by 0x401D63: メイン (main.cpp:121)
findNext と findRow を通常のイテレータやその他のクラス メソッドで使用して動作するので、operator++() に何か問題があると思います。
const_iterator のコピー コンストラクター:
さらに、クラスのメソッド内で作成および使用される const_iterators は非常にうまく機能します。
PS: findRow のコード
if(tmp==NULL) チェックに合格するため、メモリに何かがあると考えられますが、初期化されていないと表示されますが、通常のイテレータを使用すると機能します。
これがfindNextのコードです
コンストラクタ SparseMatrix(int,int,T) のコード
さらにコードが必要な場合は、お問い合わせください。
さらに、別の目的で findRow と findNext を使用していて、それらが機能することをもう一度確認させてください。constnessに関連するものだと思いますが、何がわかりません。
c++ - セット要素を変更するには?
a の要素を変更したいset
ので、 を使用しset<T>::iterator
ました。ただし、コンパイラは「要素が const である」と主張します。それから私はそれset<T>::iterator
がconst_iterator
...
では、どうすれば要素を変更できますか?消去してから新しいものを挿入しますか?