タグ付けされた質問 「stl」

標準テンプレートライブラリ(STL)は、汎用コンテナ、イテレータ、アルゴリズム、および関数オブジェクトのC ++ライブラリです。C ++が標準化されたとき、STLの大部分が標準ライブラリに採用されました。標準ライブラリのこれらの部分は、誤ってまとめて「STL」と呼ばれることもあります。

8
vector :: atとvector :: operator []
私はそれat()が[]その境界チェックのために遅いことを知っています、それは同様にC ++ Vector at / []オペレーター速度 または:: std :: vector :: at()対operator []のような同様の質問で議論されます<<驚くべき結果!! 5〜10倍遅い/速い!。私at()はその方法が何に適しているのか理解できません。 このような単純なベクトルがある場合:インデックスがあり、ベクトルが境界にあるかどうかわからない状況ではなく、std::vector<int> v(10);を使用してその要素にアクセスすることにした場合、try-catchで強制的にラップするブロック:at()[]i try { v.at(i) = 2; } catch (std::out_of_range& oor) { ... } 私はsize()自分でインデックスを使用して確認することで同じ動作を得ることができますが、これは私にとってより簡単で非常に便利です: if (i < v.size()) v[i] = 2; だから私の質問は:vector :: operator []よりvector :: at を使用する利点は何ですか? いつvector :: size + vector :: operator …
95 c++  stl  stdvector 

2
std :: setのstd :: back_inserter?
これは簡単な質問だと思います。私はこのようなことをする必要があります: std::set<int> s1, s2; s1 = getAnExcitingSet(); std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); もちろん、std::back_inserterがないため機能しませんpush_back。 std::inserterイテレータも必要ですか?使っstd::inserterたことがないのでどうすればいいかわかりません。 誰かがアイデアを持っていますか? もちろん、私のもう1つのオプションは、のベクトルを使用して、s2後でそれを並べ替えることです。多分それは良いですか?
94 c++  algorithm  stl 




7
gdbを使用した標準コンテナー(std :: map)の内容の検査
次のようなものがあるとします。 #include <map> int main(){ std::map<int,int> m; m[1] = 2; m[2] = 4; return 0; } gdbからプログラムを実行しているマップの内容を検査できるようにしたいと思います。 添え字演算子を使用すると、次のようになります。 (gdb) p m[1] Attempt to take address of value not located in memory. findメソッドを使用しても、より良い結果は得られません。 (gdb) p m.find(1) Cannot evaluate function -- may be inlined これを達成する方法はありますか?
93 c++  stl  map  gdb 


2
list <T>オブジェクトを別のオブジェクトに追加する方法
C ++では、2つのlist&lt;T&gt;オブジェクトがAありB、のすべてのメンバーBをの末尾に追加したいと思いAます。いくつかのソースを検索しましたが、簡単な解決策(ei A.append(B);)が見つかりませんでした。 これを行う最良の方法は何ですか? たまたま、私はこの後Bは気にしません(次の行で削除されます)ので、より良いパフォーマンスのためにそれを活用する方法があれば、私もそれに興味があります。
92 c++  list  stl 

6
C ++でのベクトルの初期容量
何であるcapacity()のstd::vectorデフォルトconstuctorを使用して作成されますか?私size()はがゼロであることを知っています。デフォルトの構築されたベクトルはヒープメモリ割り当てを呼び出さないと言うことができますか? このようにして、のような単一の割り当てを使用して、任意の予約を持つ配列を作成することが可能になりますstd::vector&lt;int&gt; iv; iv.reserve(2345);。なんらかの理由で、size()2345から始めたくないとしましょう。 たとえば、Linux(g ++ 4.4.5、カーネル2.6.32 amd64)の場合 #include &lt;iostream&gt; #include &lt;vector&gt; int main() { using namespace std; cout &lt;&lt; vector&lt;int&gt;().capacity() &lt;&lt; "," &lt;&lt; vector&lt;int&gt;(10).capacity() &lt;&lt; endl; return 0; } 印刷0,10。それはルールですか、それともSTLベンダーに依存していますか?

2
std :: stackがデフォルトでstd :: dequeを使用するのはなぜですか?
コンテナをスタックで使用するために必要な操作は次のとおりです。 バック() push_back() pop_back() なぜデフォルトのコンテナがベクターではなくデックなのですか? deque再割り当ては、front()の前に要素のバッファーを提供しないので、push_front()は効率的な操作です。これらの要素はスタックのコンテキストで使用されることがないため、無駄になりませんか? この方法でベクターの代わりに両端キューを使用するオーバーヘッドがない場合、priority_queueのデフォルトが両端キューではないベクトルでもあるのはなぜですか?(priority_queueには、front()、push_back()、およびpop_back()が必要です-基本的にスタックの場合と同じです) 以下の回答に基づいて更新: dequeが通常実装される方法は、固定サイズ配列の可変サイズ配列であるようです。これにより、ベクター(再割り当てとコピーが必要)よりも速く成長するため、要素の追加と削除をすべて行うスタックのような場合は、dequeの方が適しています。 priority_queueでは、削除と挿入を行うたびにpop_heap()またはpush_heap()を実行する必要があるため、インデックスの作成が必要になります。要素の追加はとにかく定数で償却されるので、これはおそらくそこでベクトルをより良い選択にします。
91 c++  stl  containers 


9
std :: map insertまたはstd :: map find?
既存のエントリを保持したいマップを想定しています。20%の確率で、挿入するエントリは新しいデータです。返されたイテレータを使用してstd :: map :: findを実行してからstd :: map :: insertを実行する利点はありますか?または、挿入を試みてから、レコードが挿入されたか、挿入されなかったかをイテレータが示すかどうかに基づいて動作する方が速いですか?
90 c++  optimization  stl  stdmap 

8
vector <bool>の代替
(うまくいけば)私たち全員が知っているように、vector&lt;bool&gt;完全に壊れており、C配列として扱うことはできません。この機能を取得する最良の方法は何ですか?これまでのところ、私が考えているアイデアは次のとおりです。 使用するvector&lt;char&gt;代わりに、または ラッパークラスを使用し、 vector&lt;bool_wrapper&gt; どうやってこの問題を処理しますか?c_array()機能が必要です。 余談ですが、このc_array()方法が必要ない場合、ランダムアクセスが必要な場合にこの問題に取り組む最善の方法は何ですか?両端キューなどを使用する必要がありますか? 編集: 動的なサイズ設定が必要です。 知らない人のvector&lt;bool&gt;ために、それぞれboolが1ビットを取るように専門化されています。したがって、それをCスタイルの配列に変換することはできません。 「ラッパー」はちょっと誤称だと思います。私はこのようなことを考えていました: もちろん、my_boolアライメントの問題が発生する可能性があるため、次に読む必要があります:( struct my_bool { bool the_bool; }; vector&lt;my_bool&gt; haha_i_tricked_you;
90 c++  stl  vector  boolean 

6
findメソッドを使用した後にstd :: mapを更新する方法は?
メソッドstd::mapを使用した後にキーの値を更新するにはどうすればよいfindですか? 私はこのようなマップとイテレータ宣言を持っています: map &lt;char, int&gt; m1; map &lt;char, int&gt;::iterator m1_it; typedef pair &lt;char, int&gt; count_pair; マップを使用して、文字の出現回数を保存しています。 Visual C ++ 2010を使用しています。
90 c++  map  stl  stdmap 

8
FIFOにはどのSTLコンテナを使用すればよいですか?
どのSTLコンテナが私のニーズに最適ですか?私は基本的に10要素幅のコンテナーを使用しており、最も古い要素(約100万回)を継続しpush_backながら新しい要素を継続的に追加していますpop_front。 私は現在std::deque、タスクにa を使用していますが、std::listそれ自体を再割り当てする必要がないので(またはa std::dequeをaと間違えているので)、aの方が効率的かどうか疑問に思っていましたstd::vector。または、私のニーズにさらに効率的なコンテナはありますか? PSランダムアクセスは必要ありません
89 c++  stl  fifo 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.