問題タブ [stl-algorithm]
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++ - Shunting Yard での括弧付き式の処理
括弧で囲まれた式を処理するために、次の手書きのループがあります。
(output
とpunctuators
はどちらも 型std::vector<token>
で、は aとデータ メンバーで構成されるtoken
非常に単純なものです。)struct
char kind
unsigned value
手書きのループからアルゴリズムに切り替えると可読性が向上するかどうか疑問に思っていました。
しかし、どういうわけか、おそらく逆イテレータの使用と、特に通常のイテレータへの変換が原因で、このコードはかなり読みにくいと感じています。より良い解決策はありますか?手書きのループの方が読みやすいと思いますか?それとも、アルゴリズムに関しては、まだ光が見えていないだけですか?
c++ - std::next_permutation実装の説明
実装方法に興味がstd:next_permutation
あったので、バージョンを抽出しgnu libstdc++ 4.7
、識別子とフォーマットをサニタイズして、次のデモを作成しました...
出力は期待どおりです:http://ideone.com/4nZdx
私の質問は次のとおりです:それはどのように機能しますか?i
、、j
の意味は何k
ですか?彼らは実行のさまざまな部分でどのような価値を持っていますか?その正しさの証明のスケッチは何ですか?
明らかに、メインループに入る前に、些細な0または1要素リストのケースをチェックするだけです。メインループのエントリで、iは最後の要素(1つ過ぎた端ではない)を指しており、リストは少なくとも2要素の長さです。
メインループの本体で何が起こっているのですか?
c++ - copy と back_inserter を使用して vector をそれ自体に追加すると、誤った結果が生じる
この質問に触発され、ベクトルをそれ自体に追加する方法を尋ねると、私の最初の考えは次のとおりでした(そして、はい、今insert
ではより良いオプションであることに気づきました):
ただし、これは次のように出力します。
* は、プログラムが実行されるたびに異なる番号です。2つしか入れ替わっていないのが異様で、実際にその説明があれば聞きたいです。続けて、別のベクトル (元のコピー) に追加すると、正しく出力されます。次の行を前に追加すると、正しく出力されますcopy
。
std::back_inserter
事前にメモリを予約していなくても、コンテナーの最後に要素を追加する安全な方法であるという印象を受けました。私の理解が正しければ、コピー行の何が問題になっていますか?
コンパイラとは関係ないと思いますが、GCC 4.7.1 を使用しています。
c++ - マップの各値に関数を適用して、並べ替えられたシーケンスを作成するにはどうすればよいですか?
C ++でSTLを使用して、aの各値に関数を適用して(値の印刷表現)std::map
を取得し、別の関数からの浮動小数点キーでソートされたコレクションに(s)を収集するにはどうすればよいですか?マップ内の対応する各値に適用されますか?std::string
std::string
別の言い方をすれば、マップ内のキーと値のペアを繰り返し処理して、新しいキーと値が古い値の関数であるキーと値のペアの新しいセットを作成したいと思います。
ただし、C++11は使用しないでください。
c++ - remove_copy_if が空のベクトルを返すのはなぜですか?
次のコードで何が間違っているのか教えてください。2 番目のベクトルの値 >= 80 が期待されますが、空です。
c++ - std::fill などのアルゴリズムで emplace を使用する
vector::emplace_back
ベクトルの塗りつぶし中に一時的なオブジェクトの構築を避けるために使用しました。ここに簡略化されたバージョンがあります:
しかし、代わりに使用したかったstd::fill_n
:
ただし、この方法では、一時的なコピーが作成されます。emplace
この状況での使い方がわかりません。のようなものが必要だと思いstd::back_emplacer
ますが、そのようなものが見つかりませんでした。それは C++11 の一部ですが、GCC にはまだ実装されていませんか? それが C++11 の一部でない場合、それを行う他の方法はありますか?
c++ - アルゴリズムを使用して元の順序を維持しながら、ソートされていないstd :: vectorから重複を削除するにはどうすればよいですか?
各整数の最初の出現順序を維持しながら、重複を削除する必要がある整数の配列があります。私はそれをこのように行うことを見ることができますが、STLアルゴリズムをよりよく利用するより良い方法があると想像しますか?挿入は自分の手に負えないので、挿入する前に重複をチェックできません。
STLアルゴリズムを使用してこれをどのように行うことができますか?
c++ - ポインターの std:vector で std::sort が失敗する
次のコードは、ベクターの並べ替え中にクラッシュします。
これはなぜですか?
c++ - std :: fill、std::copyはstd::vectorに特化しています?
この質問について考えるとき、私は、std::copy()
および/またはstd::fill
に特化されている(私は本当に最適化されている)かどうか疑問に思い始めstd::vector<bool>
ます。
これはC++標準で必要ですか、それともC ++ stdライブラリベンダーによる一般的なアプローチですか?
簡単に言えば、次のコードがあるかどうか知りたいです。
それよりも優れている/異なる:
非常に厳密に言うと、たとえば、次のようにできます。単一ビットではなく、バイト全体std::fill<std::vector<bool>::iterator>()
の内部表現に移動して設定しますか?友達をstd::vector<bool>
作ることは図書館のベンダーにとって大きな問題ではないと思いますか?std::fill
std::vector<bool>
[アップデート]
次の関連する質問:私(または他の誰か:)は、まだ専門化されstd::vector<bool>
ていない場合、たとえば、そのようなアルゴリズムを専門化できますか?これはC++標準で許可されていますか?これは移植性がないことはわかっていますが、選択した1つの標準C ++ライブラリだけですか?私(または他の誰か)がstd::vector<bool>
プライベートパーツに到達する方法を見つけたと仮定します。