タグ付けされた質問 「c++-standard-library」

C ++プログラミング言語では、C ++標準ライブラリはクラスと関数のコレクションであり、コア言語で記述されている場合とされていない場合があり、C ++の一部です。

25
std :: stringを小文字に変換する方法は?
std::string小文字に変換したい。この機能は知っtolower()ていますが、以前はこの機能に問題std::stringがありました。いずれにしても、を使用して各文字を反復処理する必要があるため、これは理想的ではありません。 100%動作する代替手段はありますか?


5
「STL」と「C ++標準ライブラリ」の違いは何ですか?
誰かがもたらしたこの記事をクレームはというのが私の注意に(私は言い換えだ) STL項は全体のC ++標準ライブラリの代わりに、SGIのSTLから採取された部分を参照するために悪用されています。 (...)STL(SGIで設計された)をまだほとんど使用していないという事実にもかかわらず、「STL」を指します。 C ++標準ライブラリの一部はSTLの一部に基づいており、多くの人々(複数の作者や悪名高いエラーに悩まされているcplusplus.comを含む)が「STL」と呼んでいるのはこれらの部分です。ただし、これは不正確です。実際、C ++標準では「STL」については言及されておらず、2つのコンテンツには違いがあります。 (...)「STL」は、SGI STLに基づくstdlibのビットを参照するために使用されることはほとんどありません。人々はそれが全体の標準ライブラリだと思っています。CVに配置されます。そしてそれは誤解を招くものです。 私はC ++の歴史についてほとんど何も知らないので、記事の正確さを判断できません。STLという用語は使用しないでください。それともこれは孤立した意見ですか?

9
C ++ valarray対vector
私はベクターが大好きです。彼らは気の利いた、速いです。しかし、私はvalarrayと呼ばれるものが存在することを知っています。なぜベクトルではなくvalarrayを使用するのですか?valarrayには構文上の砂糖があることは知っていますが、それ以外の場合、いつ役立つのですか?

8
反復中のstd :: setからの要素の削除
セットを調べて、事前定義された基準を満たす要素を削除する必要があります。 これは私が書いたテストコードです: #include <set> #include <algorithm> void printElement(int value) { std::cout << value << " "; } int main() { int initNum[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; std::set<int> numbers(initNum, initNum + 10); // print '0 1 2 3 4 5 6 7 …


2
libc ++での短い文字列最適化のメカニズムは何ですか?
この回答は、短い文字列の最適化(SSO)の概要を示しています。ただし、実際に、特にlibc ++実装でどのように機能するかを詳しく知りたいのですが。 SSOの対象となるには、文字列はどのくらい短い必要がありますか?これはターゲットアーキテクチャに依存しますか? 文字列データにアクセスするとき、実装はどのように短い文字列と長い文字列を区別しますか?それは同じくらい簡単m_size <= 16ですか、それとも他のメンバー変数の一部であるフラグですか?(私はそれm_sizeまたはその一部が文字列データを格納するために使用されることもあると思います) 私がこの質問をlibc ++に対して特別に尋ねたのは、それがSSOを使用していることがわかっているためです。これは、libc ++ホームページにも記載されています。 ソースを確認した後の観察結果を次に示します。 libc ++は、文字列クラスの2つのわずかに異なるメモリレイアウトでコンパイルできます_LIBCPP_ALTERNATE_STRING_LAYOUT。これはフラグによって制御されます。どちらのレイアウトでも、リトルエンディアンマシンとビッグエンディアンマシンが区別され、合計4つの異なるバリアントが存在します。以下の説明では、「通常の」レイアウトとリトルエンディアンを想定します。 さらにそれsize_typeが4バイトでvalue_type1バイトであると仮定すると、これは文字列の最初の4バイトがメモリ内でどのように見えるかです。 // short string: (s)ize and 3 bytes of char (d)ata sssssss0;dddddddd;dddddddd;dddddddd ^- is_long = 0 // long string: (c)apacity ccccccc1;cccccccc;cccccccc;cccccccc ^- is_long = 1 短い文字列のサイズは上位7ビットであるため、アクセスするときにシフトする必要があります。 size_type __get_short_size() const { return __r_.first().__s.__size_ >> 1; } 同様に、長い文字列の容量のゲッターとセッターは__long_mask、is_longビットを回避するために使用します。 私はまだ私の最初の質問に対する答えを探しています。つまり__min_cap、異なる文字列に対して、どのような値、短い文字列の容量がとるのでしょうか? その他の標準ライブラリの実装 …

2
C ++ 17でファイルサイズをバイト単位で取得する方法
特定のオペレーティングシステムの落とし穴はありますか。 そこに多くの重複(ある1、2、3、4、5、この質問のは)しかし、彼らは数十年前に答えました。これらの質問の多くで投票数が非常に多い回答は、今日間違っています。 .sxでの他の(古いQAの)メソッド stat.h(ラッパーsprintstatf)、syscallを使用 tellg()は、定義ごとに位置を返しますが、必ずしもバイトではありません。戻り値の型はではありませんint。

1
libc ++のvector <bool> :: const_referenceがboolではないのはなぜですか?
セクション23.3.7クラスvector&lt;bool&gt;[vector.bool]、パラグラフ1は次のように述べています。 template &lt;class Allocator&gt; class vector&lt;bool, Allocator&gt; { public: // types: typedef bool const_reference; ... ただし、libc ++を使用すると、このプログラムはコンパイルに失敗します。 #include &lt;vector&gt; #include &lt;type_traits&gt; int main() { static_assert(std::is_same&lt;std::vector&lt;bool&gt;::const_reference, bool&gt;{}, "?"); } さらに、C ++標準はこの仕様でC ++ 98までずっと一貫していることに注意します。また、libc ++が最初に導入されて以来、libc ++はこの仕様に一貫して準拠していないことにも注意してください。 この不適合の動機は何ですか?


4
最新のC ++の実験的な機能は、長期的なプロジェクトに対して信頼できますか?
現在C ++ 11/14を使用しているプロジェクトがstd::filesystemありますが、C ++ 17でのみ使用可能なのようなものが必要であるため、現在使用する機会がありません。ただし、現在のコンパイラではstd::experimental::filesystem。として使用できるようです。将来、次のようなものを追加できると仮定して、実験的な機能を使用することをお勧めしますか? #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 私の懸念は次のとおりです。 1.すべての準拠コンパイラが同じ実験機能を備えていることが保証されていますか? 2.実験的な機能は、信頼性を低下させる大きな変更が発生する傾向がありますか? たぶん、疑問に思うことがもっとあります。なぜそれらを使用する必要があるのですか、または使用しないのですか?私は新しいプロジェクトに戸惑い、何を決めるのかわかりません。

9
C ++標準ライブラリにtransform_ifがないのはなぜですか?
構成コピー(1.で実行可能copy_if)を実行したいが、値のコンテナーからそれらの値へのポインターのコンテナー(2.で実行可能transform)を実行したい場合に、ユースケースが出現しました。 利用可能なツールでは、2ステップ未満でそれを行うことはできません: #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; struct ha { int i; explicit ha(int a) : i(a) {} }; int main() { vector&lt;ha&gt; v{ ha{1}, ha{7}, ha{1} }; // initial vector // GOAL : make a vector of pointers to elements with i &lt; 2 vector&lt;ha*&gt; ph; // …

2
多くの標準ライブラリタイプのC ++ 20でoperator!=が削除されるのはなぜですか?
cppreferenceによると、std::type_info::operator!=C ++ 20で削除されますが、std::type_info::operator==明らかに残っています。 背後にある理由は何ですか?不平等を比較することは無意味であることに同意するかもしれませんが、平等を比較することも同様に無意味ですよね? 同様に、operator!=などの容器を含む他の多くの標準ライブラリの種類のstd::unordered_map::operator!=とstd::unordered_set::operator!=cppreferenceに従って20 C ++で除去されます。 書き込みに持つことif(!(id1 == id2))に比べて任意のコードがどの明確にしないif(id1 != id2)だけで、反対、対照的に、...


2
なぜ `std :: string :: find()`は失敗時に終了イテレータを返さないのですか?
の動作がstd::string::find標準のC ++コンテナと一致しないことがわかりました。 例えば std::map&lt;int, int&gt; myMap = {{1, 2}}; auto it = myMap.find(10); // it == myMap.end() しかし、ひもについては、 std::string myStr = "hello"; auto it = myStr.find('!'); // it == std::string::npos 代わりに失敗したmyStr.find('!')リターンをすべきではないmyStr.end()のstd::string::nposですか? std::stringは他のコンテナと比較するとやや特殊なので、これには何らかの理由があるのか​​と思います。(驚いたことに、私はこれをどこかで疑う人を見つけることができませんでした)。

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