問題タブ [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++ - 最後に挿入することは std::copy() と同等ですか?
ベクトルに要素を追加するには、次の 2 つの方法を検討してください。
std::copy
バージョンはよりきれいに見え、2 回入力する必要はありませんvi2
。しかし、挿入はメンバー関数であるのに対し、これは一般的なアルゴリズムであるため、同じことinsert
を行うよりも優れたパフォーマンスを発揮できるでしょうか?std::copy
私は自分自身をベンチマークできますが、すべてのテンプレート タイプのすべてのベクトルに対して実行する必要があります。誰かがすでにやっていますか?
stl-algorithm - ブースト範囲で変換アルゴリズムを使用する
こんにちは、boost.range を使用して 2 つの std ベクトルを追加しようとしていますが、大量のエラーが発生します。
これは機能します:
これはしません:
エラーあり:
そしてこれも:
エラーあり:
c++ - Visual Studio 2008 のバグ? インクルード アルゴは、行 3795 で反復子の順序を誤って交換しているようです
マップのキーをセットの値と比較することで、includes
アルゴリズムを動作させようとしています。回避する必要がある問題はもちろん、それはwhileであるため、両方の引数に同じ値の型を期待するデフォルトでは機能しません。set
map
map<K,V>::value_type
pair<K,V>
set<V>::value_type
V
includes predicate<T>
したがって、これを回避するために以下の述語クラスを書いています
ただし、VS2008 xutility ファイルの 313 行目でテンプレート インスタンシエーターがスローされます。
const V
パラメータ1をからに変換できないというメッセージが表示されますconst std::pair<_Ty1,_Ty2>
これは、ファイルの 3795 行目で発生しているようです。
最初と 2 番目の引数が交換されているように見えるリリース構成でコンパイルすると、3795 行目で同じエラーが発生するため、Visual Studio の実装では、スイッチ (存在する場合) をいじらない限り、このコードを実行する必要があるようです。 _DEBUG_LT_PRED' マクロ。
私の質問は次のとおりです。これは Visual Studio のバグですか、それともこのような理由があり、間違いを犯していますか? 私は 10 年以上 C++ を使っていませんでしたが、先週いくつかのタイトなループで速度を上げるために取り直さなければならなかったので、私が得ることができるすべての助けが必要です。
皆さんありがとう
良い、
アルゴリズムの要件については考えていませんでした。両側から「未満」をチェックする必要があるのは理にかなっています。
ただし、これをコンパイルするのはあまり楽しいことではありません。
私の以前のコードで
私は得ていた
第 1 引数として double を取ることができる operator() がないため、これは理にかなっています。
追加のオーバーロードされた operator() を使用
私は今得ています
注目すべきは、すべてのエラーが 2 番目operator()
、K
1 番目とP
2 番目のものを参照しているように見えることです。そして、はい、言及されている変換はどれも、その演算子では可能であってはなりません。しかし、なぜコンパイラは他の演算子を試さないのでしょうか? つまり、それらの変換が許可されるべきものです。(ところで、疑問に思っている場合に備えて、エラーはそれぞれ2つの異なる行で発生するため、繰り返されます)
これが考えられるもう1つのことは、もちろんconstの不正確さです。長くなりましたので、じっくり考えてみたいと思います。
助けてくれてありがとう
2013 年 5 月 15 日に編集
私は「それをやり遂げる」必要があったので、includes
2 つのセットでアルゴを呼び出すことができるように、マップ キーをセットに入れることでこの問題を回避しました (明らかなパフォーマンス ペナルティが発生しました)。私はまだこれを適切に解決したいと思っています。Visual Studio 2008 で説明しているコンパイラ エラーを再現するために必要なすべてのコードを次に示します。
コンパイラが吐き出す
最初のエラーだけを見ると、operator()(KEY,PAIR) を使用して PAIR,KEY を渡したいようです。利用可能な operator()(PAIR,KEY) を無視するのはなぜですか??? 他のエラーはすべて同じ傾向にあります。コンパイラは、完全に適切なオーバーロードされた演算子を無視するように「見えます」
助けてくれてありがとう
c++ - カスタム コンパレータを使用した std::sort 中の std::out_of_range
次のコードがあります
これで、double である別のベクトルに基づいてインデックス ベクトルをソートする単純なソート コードができました。'circle_fwd_vector' は、すべて double を含むベクトルです。
コンソールで、次のような結果が得られます。
私はカスタムクラスを使用しておらず、並べ替えているベクトルは double のみに基づいているため、なぜこれが範囲外になるのかわかりません。double ベクトルに無限大がないことを確認しましたが、たとえあったとしても、 std::sort はインデックスから外れることなく、正しいソート済みインデックスを提供するべきではありませんか?
助けてくれてありがとう。
編集: 役立つ場合は、これが発生したときのベクトルのデータ ダンプを次に示します。 http://pastebin.com/7wLX63FJまた、Xcode 3.2.6 に同梱されている GCC 4.2 を使用してこれをコンパイルしています。
c++ - std::removeはコンパイルエラーを引き起こします
質問の回答を使用しようとしていますが、奇妙なエラーが発生します-
/usr/include/c++/4.6/bits/stl_algo.h:162:エラー:'__ first .__ gnu_cxx :: __ normal_iterator <_Iterator、_Container> :: operator * with _Iterator =User*の'operator=='に一致しません。 _Container = std :: vector、__gnu_cxx :: __ normal_iterator <_Iterator、_Container> :: reference = User&== __val'</ p>
Linux(Ubuntu 64ビット)を使用していますが、それが問題である可能性があります。前もって感謝します。
更新:remove()を使用するコード:
c++ - アルゴリズム関数: テンプレートにするか、std::function パラメーターを取りますか?
Graph という C++ クラスがあり、アルゴリズム メソッド for_each_node() があります。次のように、テンプレートにすることもできます。
または、次のように std::function を使用します。
std::for_each などの標準アルゴリズムは最初のアプローチを使用しますが、gtkmm (GTK+ の C++ バインディング) などの一部のライブラリは、関数をそれらを含むオブジェクトの関数ポインターとして受け取ります。
各オプションの利点と欠点は何ですか? どちらを選択すればよいかわかりません。選択に影響を与えるもの: Graph クラスがクラス テンプレートかどうか、アルゴリズム メソッドで使用されると予想されるさまざまな関数の数、または速度要件。
c++ - 「typedef」タイプの配列で STL コピーが失敗しました
プラットフォーム: MinGW64 (rubenvb 4.7.2)、Windows 7 (64)、Qt 4.8.2
与えられたコード セグメントは次のとおりです。
コンパイラが次のエラー メッセージをスローする理由がわかりません (同様のメッセージは、'typedef long T_PSIZE;' から 'typedef int T_PSIZE;' に変更された場合にも表示されます)。
コンパイラのテンプレート エンジンが long int 型を認識できないようです。「ordinary int」の配列で同様のステートメントを使用しましたが、うまく機能します。ターゲット配列のサイズを正確に知っているため、STL コンテナーを使用していないため、back_inserter のようなものを再実装する必要はないと思います。私は何かを逃しましたか?
注:このような質問が役立つかどうかはわかりません。(または、ステートメントが typedef された変数で機能するように、「完全な」修飾名を取得するにはどうすればよいですか?)
c++ - keyがvalより大きいマップの最初の要素を見つけるにはどうすればよいですか?
私はmap<double,T>
(say T==string
)を持っていて、キーが指定された数よりも大きいようなマップの最初の要素を見つけたいと思いました。調べて、 upper_boundとlower_bound<algorithm>
を見つけました。
不思議なことに、私は上記の最初のものを使用して取得できますが、使用できlower_bound
ませんupper_bound
、何が間違っていますか?
c++ - 「find」の呼び出しに一致する関数がありません
次のコードがあります。
gcc 4.7.1 を使用して Ubuntu でコンパイルしようとすると、次のエラーが発生します。
ベクターはコンテンツで初期化されていないため、このコードは何もしませんが、コンパイルする必要があります。
これはgccの問題だと思いますが、たくさん掘り下げた後、必死になりました。誰かがこの問題に遭遇し、それを解決する方法を知っている場合はお知らせください。
c++ - カスタムクラスのオーバーロード std::find
std::find
オブジェクトのカスタムクラスをオーバーロードすることは可能ですか/「良い」ですか? そして、等値演算子をオーバーロードしません。コンテナーが実際のデータへの (スマート) ポインターを格納しているとします。データ レイアウトやストレージ モードにはあまり興味がなく、特定のデータ メンバーを見つけたいだけです。
これは合法的、「道徳的」ですか?私が持っているとしたら、std::vector<std::shared_ptr<myClass> >
またはユーザー定義のコンテナを「でも」持っていますか?std::find_if
それとも、このような場合は常に頼るべきですか?