問題タブ [boost-range]
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++ - any_rangeと「標準形」をブーストします-後者は何ですか?
Boostのany_rangeドキュメントには、次のように書かれています。
基盤となるのは利用可能な最速の実装ですが、インクリメント、デクリメント、アドバンス、イコールなどを実装するために必要な仮想関数呼び出しのコストのため
any_iterator
、のパフォーマンスオーバーヘッドは依然としてかなりのものです。多くの場合、より適切な設計選択は標準形に変換することです。any_range
著者は「標準形」とはどういう意味ですか?誰かが例をあげることができますか?
編集: ここで提案されているように、私はブーストユーザーのメーリングリストで同じ質問をしました。このテキストの原作者であるNeilGrovesは、次のように述べています。
たとえば、範囲をベクトルにコピーします。
はい、これはまさに私がドキュメントを書くときに考えていた代替設計です。any_rangeを反復処理するオーバーヘッドはかなり大きく、具体的な結果タイプをベクトルなどのコンテナーにコピーする場合と比較すると、多くの場合不十分です。ただし、これは常に当てはまるわけではなく、Boost.Rangeの一部のユーザーは、any_rangeインスタンスで動作するアルゴリズムを実装する機能を望んでいます。これは、たとえば、さまざまなコンテナをサポートする共有ライブラリからのアルゴリズムの公開を可能にするために望ましい場合があります。any_rangeを使用することは、範囲を超えるパスの数が少ない場合にも意味がありますが、基になるコンテナのメモリサイズは非常に大きくなります。
多くの場合、パフォーマンスのオーバーヘッドは重要ではありません。私は、any_rangeの使用法が広く採用されるように誰かを誤解させないようにしたかったのです。このクラスの有効な使用法は少ないと思いますが、正確に正しい設計上の選択である場合もあります。やがて、いくつかの追加の説明と例を使用してドキュメントを改善します。
c++ - boost::range を使用した C++ での派手なインデックス作成
Boost::range を使用して、NumPy と Matlab で利用可能な「派手なインデックス作成」に似たものを実現したいと考えています。具体的には、別のコンテナーの要素をインデックスとして使用して、あるインデックス可能なコンテナーの特定の要素を選択したいと思います。たとえば、Python では次のことができます。
C++ で boost::range を使用すると、上記のコードは次のようになると思います。
「indexed」という名前は既存のレンジ アダプター (boost::adaptor::indexed) で既に使用されているため、上記のコードではまだ実装されていないインデックス アダプターを「sampled」と呼んでいます。
そのようなアダプターがブーストのどこかにすでに存在するか、または共有しても構わないと思っている実装があるかどうかを誰かが知っていますか? 最初に「sampled_iterator」(iterator_adaptor を使用)、次に「sampled_range」(iterator_range を使用) を記述して、自分で実装しようとしましたが、かなりトリッキーだと思います。
c++ - 既存のストレージに適用されるのではなく、出力ストレージを作成する C++ アルゴリズムは?
C++ std アルゴリズムは、入力シーケンスと出力シーケンスを取り、入力シーケンスの要素から出力シーケンスの要素を作成する多数のアルゴリズムを定義します。(最良の例はstd::transform
.)
std アルゴリズムは明らかiterators
にOutputIterator
.
あれは:
そして、これは標準ライブラリに関する限り問題ありません。イテレータが面倒すぎると感じたときは、Boost.Rangeを使って単純化することがよくあります。
ただし、この場合、Boost.Range の変更アルゴリズム もを使用しているようOutputIterators
です。
だから私は現在、そこに便利なライブラリがあるかどうか疑問に思っています.
――もし無いのなら、無いのには何か理由があるのでしょうか?
編集:実装例(これがすべての場合に機能するかどうか、およびこれが最も理想的なものであるかどうかは不明です):
(注:convenient::transform
返されたベクトルは(N)RVOのためにコピーされないため、手書きのものと同じパフォーマンス特性を持つと思います。とにかく、この質問ではパフォーマンスは二次的なものだと思います。)
編集/注:これまでに提供された回答(コメント、実際)のうち、Davidは非常に優れた基本的な一般的な例を提供しています。
そしてLuc は、wrtの潜在的な問題について言及していますstd::back_inserter
。ジェネリック性。
どちらも、私がこれを自分で作成することをためらう理由と、これを自分でコーディングするよりも「適切な」(適切にテストされた) ライブラリが望ましい理由を示しています。
上記の太字で表現された私の質問、つまり、あるのか、またはない理由があるのか については、ほとんど答えられていません。
c++ - テンプレートのインスタンス化のために関数内に名前空間シンボルをロードする
私はテンプレート化されたoperator+=
関数を作成し、それに一意の名前空間を与えました (私は時々それを使用したいだけで、これにより明示的に使用できます)。
次に、オペランドで使用する別のテンプレート関数内でその関数を使用したいと思いますが、プログラムのどこかで実行operator+=
するすべての呼び出しに飛びつくのを待って、シンボルテーブルにぶら下がったままにしたくありません。+=
また、広く含まれているヘッダー内でこれを行う必要があります。
これの基本的な例は次のとおりです。
この結果を達成する方法はありますか?
c++ - ベクトルの複数のレイヤーを非表示にし、単一の範囲として公開するBoost.Rangeを作成するにはどうすればよいですか?
変更できないレガシークラス階層があります。外部ライブラリの要件のため、LineとRingのBoost.Rangesを定義する必要があります。どちらも、1回の実行でポイントのみを公開します(つまり、LineとRingの両方で、Boost.Range of Pointsである必要があります)。 。
説明するための擬似コード:
ポイントは直接保存されるため、ラインは簡単です(Boost.Rangeを使用してこれを正常に実行しました。例を参照してください)。ただし、各ラインのポイントに直接到達する必要があるため、Ringでこれを行う方法がわかりません。
c++ - ブースト範囲アルゴリズムの組み合わせ。boost::copy および boost::remove_if
範囲シーケンスに適用する必要があるアルゴリズムの複雑なリストを作成しようとしています。次のコードのような構文を使用して、多くのアルゴリズムをネストしたいと考えています。私の唯一の問題は、コンパイルできないことです。助言がありますか?
この構文が機能するために、内部アルゴリズムのテンプレート パラメーターを指定する必要はありません。これは auto キーワードを使用して簡略化できますが、コードの下位互換性を維持する必要があります。
これは、エラー メッセージの一部です。
c++ - ブースト::要素の範囲をcout
Boost Rangesには、要素を簡単にカンマやスペースで区切るなどの方法が組み込まれていますか?
もちろん、それらをループして別々に印刷できることは承知していますが、これは何らかの方法で組み込む必要があるようです(スクリプト言語でベクトルを印刷するなど)。
私が見たサンプルプログラムでは、作者は範囲をcoutにコピーしました。
boost :: copy(range、ostream_iterator(cout、 ""))
私には醜いように見えます。これは慣用的ですか?
編集:stdイテレータのソリューションも受け入れられます。
EDIT2:私がやりたいことはこれです:
しかし、私はそれがうまくいくとは思いません。だから私が望んでいるのはこのようなものです(Pythonに触発されました):
またはおそらくレンジアダプターを使用します。
c++ - std::イテレータのペアをboost::iterator_rangeに変換する
があり、からstd::multimap
を作成したい。ドキュメントでそれを行う簡単な方法が見つからなかったので、次のことを試しました。boost::iterator_range
equal_range
驚くべきことに、(GCC 4.1.2 を使用して) 動作します。それがどのように機能するのか興味があります。iterator_range
それを行うコンストラクターのオーバーロードは見つかりませんでしmultimap::iterator_range
た。明らかに、ブースト範囲を返すオーバーロードもありません。
c++ - iterator_range を返す方法
iterator_range を作成して保持したいと思います。範囲は、述語に基づいて構築されます (この例では、偶数を探します)。
私はこれを行うことができますが、反復されている基になるベクトルから要素をコピーする必要があるようです。
以下のサンプルで ">>>" とマークされたコメントを探してください。
iterator_range を作成し、元のベクターからエントリの複製を作成する必要がない方法はありますか?
私は、この特定の状況に対する答えを見ましたが、見たことがありません。
c++ - boost::joined_range を使用して範囲アダプターを実装する方法
以下は、 Implement a Range Adapter with argumentsに基づいた範囲アダプターの例です。
出力
1 2 3
上記を調整してboost::joined_rangeを使用したいと思います。つまり、2 つのベクトルを取り、それらを 内の 1 つの長い範囲に結合しますpermutation_range
。アイデアは簡単です:
出力する例2 4 6
:
これまでの私の試行はすべて、コンパイラ エラーの膨大なリストで終了しました。それが可能かどうかはわかりませんが、誰かがここで私を助けてくれませんか?
FINAL EDIT (基本クラスの前に範囲を初期化するための少しハックしたソリューション)