問題タブ [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.

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

c++ - イテレータを間接参照すると、変換できないように見えるときに「変換できません」というエラーが発生します

VS 2008を使用する場合、ターゲット環境は、違いが生じる場合はARMプロセッサを搭載したWindowsCEです。私たちが使用しているコンパイラも古いものだと知っています...

私が抱えている基本的な問題は、自分が作成したマップラッパー用に独自のイテレーターを作成しようとしていて、演算子->()をオーバーロードすると問題が発生することです。これは私に問題を与えているコードのビットです:

通常、const変数を返すことは実際には意味がないことは知っていますが、それを行わずにプログラムの残りの部分をconst-correctにする方法でこれを行う方法を理解できないようです。

私が得るエラーはこれです:

エラーC2440:'return':'const std :: pair <_Ty1、_Ty2>*'から'const std :: pair <_Ty1、_Ty2>*'に変換できません

このイテレータのヘッダーは次のようになります。

ご覧のとおり、m_MapIterとオーバーロードされた演算子の戻り値はどちらも同じです...プロジェクトのこの部分の.hファイルと.cppファイルからすべてのconstステートメントを取り出し、同じエラーで再コンパイルしました、だからこれは問題ではないと思います。

代わりにこのようなことをすると、プログラムはコンパイルされます。

これを行うとメモリリークが発生することはわかっていますが、これを投稿するためのスペースを節約するためだけに、スマートポインタに入れませんでした。

関連性があると思われる場合に備えて、.cppファイル全体を以下に示します。

ObjectMapIterator定義は、ObjectMap.hファイル内にあります。したがって、ObjectMapIteratorを含めることを忘れないでください。

私はこれに頭を悩ませてきました。何かわかりましたら教えてください。ありがとう!

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

c++ - 対応する反復子から const_iterator を定義できません

要素の操作をより柔軟に制御できるように、stl コンテナーを自己定義コンテナーで拡張しています。

次のようにイテレータを使用すると、このコードは正常に実行されます

しかし、イテレータを const_iterator に変更するとコンパイルされません。定数イテレータを定義するには、 value_type を X から X const に置き換えるだけであると述べている記事を読みました。これが私のコードで行った方法です。しかし、イテレータによって返される参照は私の場合はコンテナー自体であるため、私の場合はうまくいかない可能性があることがすぐにわかります。コーディングを複製せずに const_iterator を機能させる方法がわかりません。

さらに、イテレーターは std::iterator から派生していますが、イテレーターのコンストラクターをオーバーライドできないことがわかりました。T *pt 以外に複数のパラメーターをイテレーターに渡す方法はありますか? ありがとう。

0 投票する
7 に答える
52683 参照

c++ - cbegin/cend の背後にある理由は何ですか?

なぜcbegincendが C++11 で導入されたのだろうか?

beginこれらのメソッドを呼び出すと、およびの const オーバーロードと違いが生じるのはどのような場合endですか?

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

c++ - 不変条件に影響を与えないセットの非定数イテレータを介してメンバーにアクセスする

次のようなコードがあるとしましょう:

MoreFields を記述しても不変条件に影響を与えないこと、またはセット内の要素の順序を無効にするようなことをしないことをコンパイラに保証するにはどうすればよいですか?

ベクトルなどの別のコンテナーを使用することが唯一の手段である場合、既に存在するかどうかを確認しながら、並べ替えられた位置に新しい値を挿入するにはどうすればよいですか?

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

c++ - リターンイテレータを挿入

私は実装してclass graphいます。と同様にstl、挿入関数のシグネチャは次のようになります。

pair<iterator,bool> insert ( const value_type& x );

私のクラスでは、とを実装iteratorconst_iteratorました。2つのi(オーバーロード)insert関数を定義する必要があります。1つは戻りpair<iterator,bool>、もう1つは戻ります。pair<const_iterator,bool>

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

c++ - const_iterator と const_iterator::value_type の constness

なぜSTLで

と同じタイプです

なぜそのように設計されているのですか?最初のものはconst Tで、2番目のものはTのみであるべきではありませんか? イテレータの基礎となる const の正しい型をどのように取得することになっていますか? 独自のテンプレート クラスと特殊化を記述して、

しかし、それを保持するメンバー typedef があるべきではありませんか?

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

c++ - map<>::iterator を map<>::const_iterator として渡す &

map<...>::iterator オブジェクトを const_iterator として関数に渡す際に問題があります & GCC:

私の問題は、Visual Studio 2010 では上記のコードは問題なく動作しますが、GCC 4.1.2 では、_GetInstList(it, SomeString) の関数呼び出しに一致する関数がないというエラーが表示されることです。問題は、イテレータを const_iterator & に変換しているようです。

「それ」は _GetInstList() 内で変更され、呼び出し元関数がそれをチェックするため、参照によって取得する必要があります。(「it」ポインターは、ポイントされた要素ではなく変更されます)。

また、SomeFunction() の「it」は、要素を変更するため、const にすることはできません。

どうすればこれを解決できますか?

編集: イテレータから const_iterator への変換に問題があることを示唆している場合: 関数プロトタイプが const_iterator を参照として使用しないように変更されている場合、コードは正常にコンパイルされます。問題は const & です。

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

c++ - const_iteratorを使用してC++クラスを公開する方法

Boost.Pythonを使用してサードパーティのC++APIを公開しています。

私がやってきたヘッダーファイルは、反復可能なクラス(hasbeginendmethods)と、反復を実行するためのカスタムイテレータークラスを宣言します。-

これらから派生した最小限のラッパークラスを作成しました:-

そしてBoost.Python宣言:-

ここでの唯一の奇妙な点は、const_iteratortypedefの使用です。これはBoost.Pythonイテレータのドキュメントで説明されており、私が収集したものから、必要なのはのテンプレートパラメータのconst修飾子だけです。iteratorすなわち

ただし、Linuxx86_64でGCC4.7.2を使用すると、次のコンパイラエラーが発生します。-

そのような反復可能なクラスをどのように公開する必要がありますか?

乾杯、アレックス

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

c++ - カスタム テンプレート ベースの反復子クラスのオブジェクトを const_iterator に変換します

私は大学で OOP コース (C++ がベース言語) を勉強しています。私の仕事は、独自のリンク リスト テンプレート コンテナー クラスを実装することです。私はそれをほぼ完全にやりましたが、問題に直面しました。STL は、リストを反復処理するためのiteratorおよびクラスを提供することが知られています。const_iteratorそれらの実装はほぼ同じです。主な違いは、反復子のメソッドが参照を返すのに対し、const_iterator のメソッドは定数参照を返すことです。https://stackoverflow.com/a/3582733/2108548に従い、別のテンプレート クラスを作成しましたListIterator。次に、クラスで宣言し、typedefクラス内で宣言しました。IteratorConstIteratorList

私はこのようなものを得ました:

「コピーコンストラクター」を作成することを決定するまで、すべてうまくいきましたIterator-> ConstIterator. したがって、 ListIterator<T>(データ クラス名はどこにTあるのか) を取得し、新しいオブジェクト タイプを作成するコンストラクタ メソッドが必要ListIterator<T const>です。しかし、実際にConstIteratorは のコンストラクターはT constテンプレート パラメーターとして取得されるためconst、コンストラクターのパラメーターを削除する必要があります。これを行うヘッダーが見つかりましtype_traitsた。だから私は「コピーコンストラクタ」を書きました: typedef typename std::remove_cv::type NoConstT; ListIterator(ListIterator const &other);

しかし、うまくいきません!const_begin() をリクエストした後、次のエラーが発生しました。

しかし、それだけではありません。私の目標を達成するには、同様に変換ListNode<T>する必要があります。ListNode<T const>しかし、もう 1 つ問題があります。各リスト ノードには、前のノードと次のノードへのポインターが含まれており、ノードのコンストラクターでそれらを初期化しようとすると、再帰が発生します。もちろん、すべてのListNode<T>ノードをListNode<T const>反復して変換する関数を作成できます。しかし、私はこの解決策が好きではありません。オーバーヘッドが非常に大きくなります!

私は先生にこの質問をしました。彼は数分間それを理解することができませんでした。— 「でも、私は 3 ~ 4 時間続けました!」— 「もしそうなら、const イテレータを捨てて、それらなしでリスト コンテナをファイナライズしてください。あなたのコードを理解するには時間が必要です」(私の意見では、私のコードは非常に単純です)。私が理解したように、彼はこの質問に対する答えを知りませんでした。でも、作り方が知りたい!どうすればこの問題を解決できますか?

たくさんの間違いをお詫びします — 私は英語のネイティブ スピーカーではありません。