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

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

c++ - fill_nとfillは同じ関数ですが、パラメーターのオーバーロードが異なりますか?

私はと機能を調べていましたが<algorithm>、私にはそれらはほぼ同じことをしているように見えますが、定義が異なっています。fillfill_n

これは本当ですか、そうでない場合、それらはどのように異なりますか?

fill_nそれらの説明の言い回しはほぼ同じようです(MSDNのandから読んだものfill)。

それらが同じである場合、これらの機能の両方を使用できることの利点は何ですか?

開発者により多くのオプションを提供するだけですか、それとも一方が他方よりも高速ですか?

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

c++ - list::iterator の算術演算?

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

そして、 には 10 個の要素があることを知っていlます。最初の 7 つの要素を から取り出しlて に割り当てたいので、次vectorのようにしようとしました。

上記のコードはコンパイルできませんが、後でわかったのですが、ランダムアクセスlistサポートしていないため、算術演算をサポートしていませんか?vectorlist::iterator

もしそうなら、どうすれば上記の仕事を終えることができますか?

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

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 個の文字列がある場合、それは大幅に増加するので、これは良い考えですか、それともこれに対する他の効率的な解決策はありますか... どうもありがとうございました。

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

c++ - tolower() で for_each を使用する

STL 関数 for_each を使用して文字列を小文字に変換しようとしていますが、何が間違っているのかわかりません。問題の for_each 行は次のとおりです。

clean = for_each(temp.begin(), temp.end(), low);

temp は文字列を保持している文字列です。そして、これが私がlowのために書いた関数です:

そして、私が取得し続けるコンパイラエラーは次のとおりです。

私は何を間違っていますか?

編集:ここに私が書いている関数全体があります:

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

c++ - C++でSTLソートを使用するための比較演算子のオーバーロード

私は、社会保障番号(もちろん実際の番号ではありません)を持つ名前のリストを読み取り、コマンドラインの引数に応じて、姓またはssnのいずれかに基づいてリストを並べ替えるプログラムを作成しています。簡単にするために、<演算子をオーバーロードし、入力演算子と出力演算子もオーバーロードしました。mainの最後にsort関数と出力を追加するまで、すべてが正常にコンパイルされます。私は困惑しています。何か案は?その他のヒントも大歓迎です。

0 投票する
3 に答える
5920 参照

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。これはマルチマップよりも優れていましたが、優先キューとは一致しませんでした。

この時点での私の最良のオプションである最初のオプションについては、このデータの二重転送 (キュー -> ベクトル -> 出力) を行う必要があるのは無駄に思えます。これを行うにはもっと簡単な方法が必要だと思う傾向があります...私が見逃しているもの..

最初のオプションは、このアプリケーションではそれほど悪くはありませんが (それに先行するアルゴリズムの複雑さを考慮すると)、この二重のメモリ転送を回避するトリックがあれば、それについて知りたいです。

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

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。

0 投票する
3 に答える
1852 参照

c++ - C++ でコンテナから k 個の最小要素を選択する「最良の」(慣用的な) 方法

私はこの問題にかなり頻繁に遭遇します。シーケンスが与えられた場合、k 最小の要素を見つけます。問題はそれほど難しいことではありませんが、私が探しているのは、両方とも安全な「慣用的な」方法です (エラー)、意図をうまく伝えます。したがって、最終的に行うことは、シーケンスをソートしてから、最初の k 要素を取得することです。

これは安全で理解しやすいように思えますが、ここでの複雑さは単に n ではなく nlogn + k です。皆さんはこれをどのように行いますか、車輪を再実装することなく最適な複雑さを与える、(多分からいくつかのあいまいな関数を使用して) 偶像的な方法はありますか?

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

c++ - for_each() AND ラムダ関数を使用して C スタイルの配列を出力するテンプレート関数

簡単なことです。しかし、私は最後の 1 時間を費やし、理解できませんでした。

次のコードをコンパイルすると:

私が得るコンパイルエラーは次のとおりです。

d:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_algo.h:4185 は、for_each3 番目のパラメーターとして渡された関数を呼び出す場所です。__f(*__first);

私は問題を理解しています。私のラムダ関数は期待するように宣言されてint*いますが、のテンプレートインスタンスfor_eachint. 私はそれをある意味で解決する方法を知りませんgeneric

もちろん、型を明示的にすることで回避できますが、それは一般的ではありません。

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

c++ - ifstream を使用したコピー アルゴリズム

次のコードは、期待どおりに動作していません。それがどのように機能するかを理解するのを手伝ってください。

私のカスタム operator>> は 2 回呼び出されますが、内容は次のとおりであるため、1 回だけ呼び出されると予想されます。

ジョン:40:21-5821-0