問題タブ [iterator-traits]

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 に答える
4154 参照

c++ - 部分的な特殊化で使用されないテンプレート パラメーター

次のコードがあります。

今、私は の部分的な特殊化をしようとしていますiterator_traits。私には問題ないように思えますが、g++ 4.4.5 は文句を言います:

これは完全なエラー メッセージです。

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

c++ - iterator_trait の典型的な使用例は何ですか

私はC++が初めてなので、ご容赦ください。STL を理解しようとしていますiterator_traits。本「The C++ Standard Library」では、構造iterator_traitsは次のように定義されています。

Tしたがって、すでに公開されているサブタイプを再公開しているように思えます。さらに先に進むと、本はそれを使用する方法の例を示しています。これは次のようなものです。

私の質問は、なぜiterator_traitsここでこの構造が必要なのかというvalue_typeことMyIteratorです. 私の混乱は、サブタイプの情報template <class T>iterator_trait. したがって、できれば例を挙げて説明できれば、非常に役立つ iterator_traits が必要な理由と場所を教えてください。

0 投票する
4 に答える
8343 参照

c++ - iterator_traits の特殊化

通常のネストされた typedef ( 、など) を持たstd::iterator_traits<>、ソースを変更してはならないコンテナー クラス テンプレートの反復子に特化したいと考えています。基本的には、次のようなことをしたいと思います。value_typedifference_type

Tただし、コンパイラはから推測できないため、これは機能しませんContainer<T>::iterator

同じことを達成するための有効な方法はありますか?


例えば:

std::count()ここで、このクラスのインスタンスを使用して呼び出すとします。私の知る限り、ほとんどの STL 実装では、 をcount()返しますiterator_traits<Iterator>::difference_type。の主要なテンプレートはiterator_traits<I>単に dotypedef typename I::difference_type difference_typeです。他のネストされた型と同じです。

この例では、 がないため、これは明らかに機能しませんContainer::iterator::difference_typeiterator_traitsany のイテレータに特化することで、イテレータ クラスを変更せずにこれを回避できると考えましたContainer<T>

最後に、できれば既存のコードを変更せずに、count、find、sort などの std アルゴリズムを使用できるようにしたいだけです。iterator_traitsの全体的なポイントはまさにそれだと思いました:組み込みをサポートしていないイテレータ型の型 ( など)value_typeを指定できること。diff_type残念ながら、のすべてのインスタンスに対して traits クラスを特殊化する方法がわかりませんContainer<T>

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

c++ - 可変個引数パラメータからのイテレータカテゴリの推定

どうすれば記入できますか???

template<class...Itrs> struct itr_category { typedef /* ??? */ type; };

だから、それはすべての'操作をサポートするtype最も専門的なものです、そうでなければ、そのようなカテゴリが1つもない場合の失敗(のような)?iterator_traits<Itrs>::iterator_category...Itrsenable_if<false>::type

最も特殊iterator_category化されているとは、次の継承で最も降順の型()を意味します。

したがって、たとえば、のようなものitr_category<InputIterator,OutputIterator,...>は失敗します。

注意:これはで定義されているものとは異なる階層ですstd::iterator_traits(24.3またはhttp://en.cppreference.com/w/cpp/iterator/iterator_tagsを参照):ここでは、前者だけでなく、とのforward_iterator_tag両方から派生しています。これは、たとえばSGIドキュメント( http://www.sgi.com/tech/stl/Iterators.htmlを参照)で説明されている継承に対応します。関連する場合は、この不一致についてコメントしてください(ちなみに、これはzipイテレータの実装の一部です)。input_iterator_tagoutput_iterator_tag

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

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

なぜSTLで

と同じタイプです

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

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

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

c++ - 前方反復子は出力反復子ですか?

ForwardIterators は OutputIterators である必要がありますか? 私の現在の STL 実装 (VS2012) は と の両方から派生しforward_iterator_tagていますが、標準 [N3485] でこの要件を見つけることができません。input_iterator_tagoutput_iterator_tag

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

c++ - 前方出力反復子を定義する正規の方法

C++ 11で順方向出力反復子を標準的な方法で定義するにはどうすればよいですか?

標準によれば、forward_iterator は input_iterator のみです。したがって、対応するのforward_iterator_tagは extends のみinput_iterator_tagです。イテレータを定義するために使用std::iteratorしている場合、forward-output-iterator にはどのタグを使用しますか?

forward_iterator_tag両方を拡張するプライベートタグを定義することは標準的output_iterator_tagですか、またはより良い解決策がありますか?

0 投票する
4 に答える
1078 参照

c++ - back_insert_iterator/front_insert_iterator/insert_iterator の value_type/difference_type/pointer/reference がすべて無効なのはなぜですか?

私のプロジェクトでは、ストリームを特定のタイプの値に分割したいので、テンプレート関数を次のように実装します

TElem呼び出すときに型を明示的に指定する必要があるため、これは厄介だと思います。たとえば、次のように書く必要があります。

(テンプレート)イテレータから値の型を取得しようとし、std::iterator_traits次のように使用しました:

ただし、上記のコードは では機能しませんback_insert_iterator。名前空間back_insert_iterator/front_insert_iterator/insert_iterator内のソース コードを確認したところ、すべて.stdvalue_type/difference_type/pointer/referencevoid

これらのタイプがすべて である理由を知りたいのvoidですが、これについて何か考慮事項はありますか? 別の質問は、SplitSpace関数を呼び出すときに要素の型を明示的に指定せずに関数を実装することは可能ですか? ありがとう。