問題タブ [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++ - list::iterator の算術演算?
私はlist
このようなものを得ました:
そして、 には 10 個の要素があることを知っていl
ます。最初の 7 つの要素を から取り出しl
て に割り当てたいので、次vector
のようにしようとしました。
上記のコードはコンパイルできませんが、後でわかったのですが、ランダムアクセスをlist
サポートしていないため、算術演算をサポートしていませんか?vector
list::iterator
もしそうなら、どうすれば上記の仕事を終えることができますか?
c++ - 文字列ベクトルの並べ替え
私はソートとアルゴリズムをあまり使用しておらず、ベクトルで問題ありません。最近、私は興味深い質問に直面し、それを解決する方法についてあなたの提案を求めています. だから、以下は私の質問です。
Q、ベクター内に 4 つの文字列が与えられましたが、それらの文字に応じて特定の順序で配置する必要があります。したがって、任意の文字列の最後の文字が他の文字列の最初の文字と一致し、この文字列の最後の文字が他の文字列の最初の文字と一致する必要があるため、可能な限り長い文字列を作成する必要があります。
たとえば、「ABCD」「TGHI」「DADC」「IYUR」「CXYT」のような文字列ベクトルがある場合、「ABCD」のように配置され、3 番目の文字列「DADC」が存在し、5 番目の文字列が存在します。 「CXYT」などなので、結果は「ABCD」「DADC」「CXYT」「TGHI」「IYUR」になります。
さて、上記のルールに従って「互換性がある」場合、各文字列を他の文字列とチェックするのが良い考えかどうか疑問に思っていました..ベクトルに5つの文字列がある場合、5 + 4 + 3になります+2+1 の可能性と、たとえば 20 個の文字列がある場合、それは大幅に増加するので、これは良い考えですか、それともこれに対する他の効率的な解決策はありますか... どうもありがとうございました。
c++ - tolower() で for_each を使用する
STL 関数 for_each を使用して文字列を小文字に変換しようとしていますが、何が間違っているのかわかりません。問題の for_each 行は次のとおりです。
clean = for_each(temp.begin(), temp.end(), low);
temp は文字列を保持している文字列です。そして、これが私がlowのために書いた関数です:
そして、私が取得し続けるコンパイラエラーは次のとおりです。
私は何を間違っていますか?
編集:ここに私が書いている関数全体があります:
c++ - C++でSTLソートを使用するための比較演算子のオーバーロード
私は、社会保障番号(もちろん実際の番号ではありません)を持つ名前のリストを読み取り、コマンドラインの引数に応じて、姓またはssnのいずれかに基づいてリストを並べ替えるプログラムを作成しています。簡単にするために、<演算子をオーバーロードし、入力演算子と出力演算子もオーバーロードしました。mainの最後にsort関数と出力を追加するまで、すべてが正常にコンパイルされます。私は困惑しています。何か案は?その他のヒントも大歓迎です。
c++ - 「std::priority_queue」要素を逆順に取得していますか?
特定のクエリ ポイントに最も近いポイントのリストを作成する K 最近傍クエリ メソッドをいくつか作成しました。隣接要素のリストを維持するためにstd::priority_queue
、最上位の要素がクエリ ポイントから最も遠い隣接要素になるように を使用します。このようにして、現在調査中の新しい要素をプッシュする必要があるかどうか (現在の最も遠い隣接要素よりも距離が短い場合) を認識し、優先度キューに K 個を超える要素がある場合に最も遠い要素を pop() できます。
これまでのところ、すべて順調です。ただし、要素を出力するときは、最も近いものから最も遠いものへと並べたいと思います。現在、単純にプライオリティ キューからすべての要素をポップし、(反復子を介して) 出力コンテナーに配置します。これにより、最も遠いものから最も近いものへと順序付けられたポイントのシーケンスが生成されます。次に、std::reverse
出力反復子の範囲を呼び出します。 .
簡単な例として、プライオリティ キューを使用する線形検索を次に示します (明らかに、私が使用する実際の最近傍クエリ方法ははるかに複雑です)。
上記は、1 つのことを除いてすべてダンディです。出力イテレータの型が双方向であり、本質的に事前に割り当てられたコンテナーを指している必要があります。さて、出力イテレータによって規定された範囲内に出力を格納するというこのプラクティスは、優れており、かなり標準的でもあります (たとえばstd::copy
、他の STL アルゴリズムはその良い例です)。ただし、この場合、STL コンテナーおよび iostream に提供されているような back-inserter イテレーターを使用できるようにするために、フォワード出力イテレーター・タイプのみを要求できるようにしたいと考えています。
したがって、これは要約すると、出力イテレータにコンテンツをダンプする前に、プライオリティ キューを逆にすることになります。したがって、これらは私が思いついたより良いオプションです。
を作成し
std::vector
、その中の優先度キューの内容をダンプし、ベクトルの逆反復子を使用して要素を出力反復子にダンプします。std::priority_queue
をソートされたコンテナー (例: ) に置き換えてからstd::multimap
、適切なトラバーサル順序を使用してコンテンツを output-iterator にダンプします。
他に合理的な選択肢はありますか?
std::multimap
上記の2番目のオプションのように、このアルゴリズムや他のアルゴリズムの以前の実装で aを使用していました。しかし、 に切り替えるとstd::priority_queue
、パフォーマンスが大幅に向上しました。したがって、隣人のリストを維持するために優先度キューを使用する方が、並べ替えられた配列に依存するよりもはるかに優れているように思われるため、2 番目のオプションは使用したくありません。std::vector
ところで、私は で並べ替えを維持しているも試しましたstd::inplace_merge
。これはマルチマップよりも優れていましたが、優先キューとは一致しませんでした。
この時点での私の最良のオプションである最初のオプションについては、このデータの二重転送 (キュー -> ベクトル -> 出力) を行う必要があるのは無駄に思えます。これを行うにはもっと簡単な方法が必要だと思う傾向があります...私が見逃しているもの..
最初のオプションは、このアプリケーションではそれほど悪くはありませんが (それに先行するアルゴリズムの複雑さを考慮すると)、この二重のメモリ転送を回避するトリックがあれば、それについて知りたいです。
c++ - map、lambda、remove_if
だから、私はstd :: map、lambda、stlアルゴリズム(remove_if)に問題があります。実際には、std::listまたはstd::vectorと同じコードが適切に機能します。
私のテスト例:
エラーメッセージ :
ここで何が悪いのかわかりません。それで、私はそれについてのいくつかのアドバイス/指示を読んでうれしく思います。私の目標-std::mapとremove_ifなどのアルゴリズムで新しいラムダスタイルを使用します。
g ++ 4.6、-std = c++0x。
c++ - C++ でコンテナから k 個の最小要素を選択する「最良の」(慣用的な) 方法
私はこの問題にかなり頻繁に遭遇します。シーケンスが与えられた場合、k 最小の要素を見つけます。問題はそれほど難しいことではありませんが、私が探しているのは、両方とも安全な「慣用的な」方法です (エラー)、意図をうまく伝えます。したがって、最終的に行うことは、シーケンスをソートしてから、最初の k 要素を取得することです。
これは安全で理解しやすいように思えますが、ここでの複雑さは単に n ではなく nlogn + k です。皆さんはこれをどのように行いますか、車輪を再実装することなく最適な複雑さを与える、(多分からいくつかのあいまいな関数を使用して) 偶像的な方法はありますか?
c++ - for_each() AND ラムダ関数を使用して C スタイルの配列を出力するテンプレート関数
簡単なことです。しかし、私は最後の 1 時間を費やし、理解できませんでした。
次のコードをコンパイルすると:
私が得るコンパイルエラーは次のとおりです。
d:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h:4185 は、for_each
3 番目のパラメーターとして渡された関数を呼び出す場所です。__f(*__first);
私は問題を理解しています。私のラムダ関数は期待するように宣言されてint*
いますが、のテンプレートインスタンスfor_each
はint
. 私はそれをある意味で解決する方法を知りませんgeneric
。
もちろん、型を明示的にすることで回避できますが、それは一般的ではありません。
c++ - ifstream を使用したコピー アルゴリズム
次のコードは、期待どおりに動作していません。それがどのように機能するかを理解するのを手伝ってください。
私のカスタム operator>> は 2 回呼び出されますが、内容は次のとおりであるため、1 回だけ呼び出されると予想されます。
ジョン:40:21-5821-0