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

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

5
オブジェクトに優先キューSTLを使用するにはどうすればよいですか?
class Person { public: int age; }; Personクラスのオブジェクトを優先キューに保存したい。 priority_queue< Person, vector<Person>, ??? > 比較のためにクラスを定義する必要があると思いますが、よくわかりません。 また、私たちが書くとき、 priority_queue< int, vector<int>, greater<int> > 大きい方はどのように機能しますか?
80 c++  stl 

4
ジェネリック引数として特定のタイプを持つSTLコンテナー
特定のタイプのコンテナをstd::stringパラメータとして受け取る関数を作成する方法はありますか? void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } そして、入力としてすべてのタイプのstlコンテナーに対してそれを呼び出しますか?上記のように? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);

4
std :: back_inserterでstd :: transformを使用することは有効ですか?
Cppreferenceには、次のサンプルコードがありstd::transformます。 std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); しかし、それはまた言います: std::transformunary_opまたはの順序どおりの適用は保証されませんbinary_op。関数をシーケンスに順番に適用したり、シーケンスの要素を変更する関数を適用したりするには、を使用しますstd::for_each。 これはおそらく並列実装を可能にするためです。しかし、の3番目のパラメータは、std::transformあるLegacyOutputIteratorため、次の事後条件を有しています++r。 この操作の後rは、増分可能である必要はなく、以前の値のコピーは、r逆参照可能または増分可能である必要がなくなります。 したがって、出力の割り当ては順番に行わなければならないように思えます。それらは単に、アプリケーションunary_opが故障し、一時的な場所に保存されているが、出力に順番にコピーされる可能性があることを意味していますか?それはあなたがしたいことのようには聞こえません。 ほとんどのC ++ライブラリは、実際には並列実行プログラムをまだ実装していませんが、Microsoftは実装しています。私はかなり確信している、これは関連するコードである、と私は考えてそれが呼び出すこのpopulate()機能をするので確実に行うために有効なものではありません出力、のチャンクにレコードイテレータに LegacyOutputIteratorそれのコピーをインクリメントすることによって無効にすることができます。 何が欠けていますか?

3
最も安価な引数の型を決定するコンパイル時の方法
このようなテンプレートがあります template <typename T> class Foo { public: Foo(const T& t) : _t(t) {} private: const T _t; }; 引数の型がブールや文字のように取るに足らない場合にconst参照の使用を回避するための精通したテンプレートメタプログラミング方法はありますか?お気に入り: Foo(stl::smarter_argument<T>::type t) : _t(t) {}
15 c++  stl 

2
キーとしてのベクトルは、C ++で内部的にどのように機能しますか?
このSOの答えは、キーのベクトルを持つSTLマップ、ベクトルをキーとして使用できることを示しています。したがって、ベクターをキーとして使用する場合。キーは一意である必要があるため、実際にはどのように機能mapしますか?同じ要素を持つ別のベクターを挿入すると、要素ごとに重複した要素がないかチェックされますか、ベクターの名前が何かを指定していますか?配列の名前と同様に、ベースアドレスを表します。したがって、この場合はベースアドレスをキーとして使用できるため、配列をキーとして使用できますが、ベクトルの場合はキーは何ですか。内部ではどのように機能しますか。 ベクトルの名前を出力するとエラーになるので vector<int> v; cout<<v; //error
14 c++  arrays  dictionary  vector  stl 

1
`string.assign(string.data()、5)`は明確に定義されていますか、それともUBですか?
同僚はこれを書きたかった: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); 戻るstring_viewと私はアプリオリに不安になり、さらにここでのエイリアシングはUBのように見えました。 line = strip_whitespace(line)この場合、と同等であると確信できますline = std::string_view(line.data(), 5)。私はそれが呼び出すと信じてstring::operator=(const T&) [with T=string_view]と同等になるように定義されている、line.assign(const T&) [with T=string_view]と等価になるように定義され、line.assign(line.data(), 5)これを実行するために定義されています: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy of the range [s, s …

3
std :: transformを並列実行ポリシーで使用できますか?
間違えなければ 、入出力イテレータと同じ範囲を使ってその場でstd::transform実行させることができます。私がいくつかのstd::vectorオブジェクトを持っていると仮定してvec、私は書くでしょう std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) 適切な単項演算を使用しますunary_op。 C ++ 17標準を使用しstd::execution::parて、最初の引数としてinを付けて、変換を並列実行したいと思います。これにより、関数がのcppreference記事のstd::transformオーバーロード(1)から(2)に変わります。ただし、このオーバーロードへのコメントは次のように述べています。 unary_op[...]終了反復子を含むすべての反復子を無効にしたり、関係する範囲の要素を変更したりしてはなりません。(C ++ 11以降) 「要素を変更する」とは、実際にアルゴリズムを使用できないことを意味しますか、それとも、誤って解釈した別の詳細について話しているのですか?

1
GCCでのunordered_map :: insert KeyEqual例外時のメモリリーク-強力な例外安全性保証に違反していますか?
私はGCC 7.3.1を使用していますが、coilluでもテストされています。これはバージョン9.2.0だと思います。以下を使用してビルドします。 g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ここにありrai.cppます: #include <iostream> #include <unordered_map> int main() { try { struct MyComp { bool operator()(const std::string&, const std::string&) const { throw std::runtime_error("Nonono"); } }; std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare } catch (const std::exception& e) { …

3
ソートされたベクトルに、特定の値に加算されるペアがあるかどうかを線形時間で調べます
std::vector昇順で並べ替えられた個別の要素を考慮して、合計が特定の値であるコレクションに2つの要素があるかどうかを判断するアルゴリズムを開発したいと思いますsum。 私はそれぞれのトレードオフで2つの異なるアプローチを試しました: ベクトル全体をスキャンし、ベクトルの各要素std::lower_boundに対してsum、現在の要素との差に対応する要素を検索するために、ベクトルにバイナリ検索()を適用できます。これは、追加のスペースを必要としないO(n log n)時間ソリューションです。 ベクトル全体をトラバースしてにデータを入力できstd::unordered_setます。次に、ベクトルをスキャンし、各要素std::unordered_setについて、とsum現在の要素の違いを調べます。ハッシュテーブルの検索は平均して一定の時間で実行されるため、このソリューションは線形時間で実行されます。ただし、このソリューションでは、std::unordered_setデータ構造のために追加の線形スペースが必要です。 それにもかかわらず、線形時間で実行され、追加の線形スペースを必要としないソリューションを探しています。何か案は?スピードとスペースのトレードオフを強いられているようです。
8 c++  algorithm  c++11  search  stl 

1
(一部の)アイテムを1つのstd :: mapから別のstd :: mapに効率的に移動する方法は?
2つのstd::map<>オブジェクトがaありb、いくつかの述語に基づいて、1つのマップから別のマップにいくつかの要素(ノード)を移動(extract+ insert)したいと思いpます。 for (auto i = a.begin(); i != a.end(); ++i) if (p(*i)) b.insert(a.extract(i)) このコードはclangでsegfaultします。問題は、iノードがaから抽出された後のの増加であると思います。 ポストインクリメントを使用してこれを修正する正しい/唯一の方法はありますか?例: for (auto i = a.begin(); i != a.end();) if (p(*i)) b.insert(a.extract(i++)) else ++i; 編集:現在の設定ではこれを再現できないため、「gccで動作する理由」に関する部分を削除しました。ある時点でそれが以前は使用されていたと確信していますが、gcc 9.2.1では(segfaultの代わりに)デッドロックが発生します。いずれにしても、後の増分extract()は機能しません。
8 c++  stl  c++17  stdmap 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.