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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。


19
#ifdefと#if-コードの特定のセクションのコンパイルを有効/無効にする方法として、どちらが優れている/より安全ですか?
これはスタイルの問題かもしれませんが、私たちの開発チームには少し分裂があるので、他の誰かがこの問題について何か考えを持っているのではないかと思いました... 基本的に、通常の開発中にオフにするデバッグ印刷ステートメントがいくつかあります。個人的に私は以下を行うことを好みます: //---- SomeSourceFile.cpp ---- #define DEBUG_ENABLED (0) ... SomeFunction() { int someVariable = 5; #if(DEBUG_ENABLED) printf("Debugging: someVariable == %d", someVariable); #endif } しかし、チームの中には次のものを好む人もいます: // #define DEBUG_ENABLED ... SomeFunction() { int someVariable = 5; #ifdef DEBUG_ENABLED printf("Debugging: someVariable == %d", someVariable); #endif } ...これらの方法のどれがあなたにとってより良く聞こえますか、そしてなぜですか?私は、何かが常に定義されており、他の定義を破壊する危険がないため、最初の方が安全だと感じています。

8
mt19937 PRNGを簡潔、移植性、完全にシードする方法
私は誰かが<random>乱数を生成するために使用することを提案する多くの答えを見るようです、通常は次のようなコードと共に: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen); 通常、これは次のようなある種の「不吉な嫌悪」に取って代わります。 srand(time(NULL)); rand()%6; 我々は可能性がある批判侃々諤々で古い方法をtime(NULL)、低エントロピーを提供しtime(NULL)、予測可能であり、最終結果は不均一です。 しかし、それはすべて新しい方法に当てはまります。光沢のあるベニヤしかありません。 rd()単一のを返しますunsigned int。これは、少なくとも16ビット、おそらく32ビットです。MTの19937ビットの状態をシードするのに十分ではありません。 使用してstd::mt19937 gen(rd());gen()(32ビットで播種し、第一の出力を見て)良好な出力分布を与えません。7と13が最初の出力になることはありません。2つの種子は0を生成します。12の種子は1226181350を生成します。(リンク) std::random_device固定シードを持つ単純なPRNGとして実装できます。したがって、実行ごとに同じシーケンスが生成される可能性があります。(リンク)これはさらに悪いですtime(NULL)。 さらに悪いことに、前述のコードスニペットに含まれる問題にもかかわらず、コピーして貼り付けるのは非常に簡単です。これに対するいくつかの解決策は、すべての人に適しているわけではないかもしれない大量の ライブラリを取得する必要があります。 これに照らして、私の質問は、mt19937 PRNGをC ++で簡潔、移植可能、および完全にシードするにはどうすればよいですか? 上記の問題を考えると、良い答え: mt19937 / mt19937_64を完全にシードする必要があります。 だけに頼ることはできないstd::random_deviceか、time(NULL)エントロピーの源として。 Boostや他のライブラリに依存すべきではありません。 少数の行に収まるようにして、回答にコピー貼り付けして見栄えをよくする必要があります。 考え 私の現在の考えは、か​​らの出力をstd::random_device(おそらくXORを介して)マッシュアップしtime(NULL)、アドレス空間のランダム化から派生した値、およびハードコーディングされた定数(配布中に設定できる)を使用して、エントロピーでベストエフォートショットを取得できると考えています。 std::random_device::entropy() ていないものの良い指標を与えるstd::random_deviceか、しない場合がありますが。
112 c++  c++11  random 

4
列挙型クラスを基になる型に変換できますか?
enum classフィールドを基になる型に変換する方法はありますか?これは自動だと思ったが、どうやらそうではなかった。 enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; その割り当てはGCCによって拒否されています。error: cannot convert 'my_fields' to 'unsigned int' in assignment。
112 c++  c++11 


6
`const`オブジェクトで` std :: move`を使用できるのはなぜですか?
C ++ 11では、次のコードを記述できます。 struct Cat { Cat(){} }; const Cat cat; std::move(cat); //this is valid in C++11 を呼び出すとstd::move、オブジェクトを移動することを意味します。つまり、オブジェクトを変更します。移動するにはconstオブジェクトは不合理ですが、なぜstd::moveこの動作を制限しないのですか?将来的には罠になりますよね? ここでトラップとは、ブランドンがコメントで言及したとおりです。 「彼はそれが彼をこっそりとこっそりと「罠にかける」ことを意味していると思う。もし彼が気付かないと、彼は結局彼が意図したものではないコピーで終わるからだ。」 スコットマイヤーズの著書「Effective Modern C ++」で、彼は例を挙げています。 class Annotation { public: explicit Annotation(const std::string text) : value(std::move(text)) //here we want to call string(string&&), //but because text is const, //the return type of std::move(text) …
112 c++  c++11 


10
見出しを8方向に分類するときにif / else ifチェーンを回避する方法は?
私は次のコードを持っています: if (this->_car.getAbsoluteAngle() <= 30 || this->_car.getAbsoluteAngle() >= 330) this->_car.edir = Car::EDirection::RIGHT; else if (this->_car.getAbsoluteAngle() > 30 && this->_car.getAbsoluteAngle() <= 60) this->_car.edir = Car::EDirection::UP_RIGHT; else if (this->_car.getAbsoluteAngle() > 60 && this->_car.getAbsoluteAngle() <= 120) this->_car.edir = Car::EDirection::UP; else if (this->_car.getAbsoluteAngle() > 120 && this->_car.getAbsoluteAngle() <= 150) this->_car.edir = Car::EDirection::UP_LEFT; else if …
111 c++  if-statement 

9
std :: stringをLPCSTRに変換する方法
どのようにして変換することができますstd::stringにLPCSTR?また、どうすればa std::stringをに変換できLPWSTRますか? 私はこれらLPCSTR LPSTR LPWSTRと完全に混乱していLPCWSTRます。 あるLPWSTRとLPCWSTR同じ?
111 c++  windows  string 

13
C ++で「if」条件が含まれる「for」ループを回避するにはどうすればよいですか?
私が作成するほとんどすべてのコードを使用して、コレクション内の最終的な単純な "if"条件で終わるコレクションのセット削減問題に対処しています。以下に簡単な例を示します。 for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 関数型言語では、コレクションを別のコレクションに(簡単に)削減して問題を解決し、削減したセットですべての操作を実行できます。疑似コード: newCollection <- myCollection where <x=true map DoStuff newCollection そして、C#のような他のCバリアントでは、次のようなwhere句で減らすことができます foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 以上(少なくとも私の目には) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 確かに、私は多くのパラダイムミキシングと主観/意見ベースのスタイルを行っていますが、この推奨される手法をC ++で使用できるようにするための根本的な何かが欠けていると感じざるを得ません。誰かが私を啓発できますか?
111 c++  c++11  c++14 

9
C ++メンバー関数からObjective-Cメソッドを呼び出す?
問題なくクラスのEAGLViewメンバー関数を呼び出すクラス()がありますC++。さて、問題は、構文ではできないC++クラスa を呼び出す必要があることです。objective-C function [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];C++ このObjective-C呼び出しを、Objective-C最初はC ++クラスと呼ばれていた同じクラスにラップすることはできますが、そのメソッドをから呼び出す必要があり、その方法をC++理解できません。 EAGLViewオブジェクトへのポインターをC ++メンバー関数に渡して、 " EAGLView.h"をC++クラスヘッダーに含めようとしましたが、3999エラーが発生しました。 では、どうすればいいですか?例はいいです。私はCこれを行う純粋な例を見つけただけです。
111 c++  objective-c 

16
C ++:空のクラスのオブジェクトのサイズは?
空のクラスのオブジェクトのサイズはどうなるのだろうと思っていました。他のオブジェクトと同じように参照およびポイントできるようにする必要があるため、0バイトにはできません。しかし、そのようなオブジェクトはどのくらいの大きさですか? 私はこの小さなプログラムを使用しました: #include <iostream> using namespace std; class Empty {}; int main() { Empty e; cerr << sizeof(e) << endl; return 0; } Visual C ++コンパイラとCygwin-g ++コンパイラの両方で取得した出力は1バイトでした。マシンワードのサイズ(32ビットまたは4バイト)になると思っていたので、これは少し意外でした。 なぜ 1バイトのサイズなのか誰かが説明できますか?なぜ 4バイトではないのですか?これはコンパイラまたはマシンにも依存していますか?また、空のクラスオブジェクトのサイズが0バイトにならない理由について、より説得力のある理由を誰かが示すことができますか?
111 c++  class  object 

7
C ++でのステートメント順序の強制
決まった順序で実行したいステートメントがいくつかあるとします。最適化レベル2でg ++を使用したいので、一部のステートメントを並べ替えることができます。ステートメントの特定の順序を強制するためにどのツールが必要ですか? 次の例を考えてみましょう。 using Clock = std::chrono::high_resolution_clock; auto t1 = Clock::now(); // Statement 1 foo(); // Statement 2 auto t2 = Clock::now(); // Statement 3 auto elapsedTime = t2 - t1; この例では、ステートメント1〜3が指定された順序で実行されることが重要です。しかし、コンパイラはステートメント2が1と3から独立していると考え、次のようにコードを実行できないのでしょうか。 using Clock=std::chrono::high_resolution_clock; foo(); // Statement 2 auto t1 = Clock::now(); // Statement 1 auto t2 = Clock::now(); // …

3
配列とベクトル:導入の類似点と相違点[終了]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 C ++の配列とベクトルの違いは何ですか?違いの例としては、ライブラリ、象徴性、能力などがあります。 アレイ 配列には、特定のタイプの特定の数の要素が含まれています。プログラムのコンパイル時に必要な量のスペースをコンパイラーが予約できるように、配列が定義されるときに含まれる要素のタイプと数を指定する必要があります。コンパイラーは、プログラムのコンパイル時にこの値を判別できる必要があります。配列が定義されたら、配列の特定の要素にアクセスするために、インデックスと共に配列の識別子を使用します。[...]配列のインデックスはゼロです。つまり、最初の要素はインデックス0にあります。このインデックススキーマは、C ++でのポインターと配列の間の密接な関係と、言語がポインター演算用に定義するルールを示しています。 — C ++ Pocketリファレンス ベクター ベクトルは、配列スタイルのoperator[]ランダムアクセスを提供する動的にサイズ変更されたオブジェクトのシーケンスです。メンバー関数はpush_back、コピーコンストラクターを介して引数をコピーし、そのコピーをベクターの最後のアイテムとして追加し、サイズを1ずつ増やします。pop_back最後の要素を削除することにより、まったく逆のことを行います。ベクターの最後からアイテムを挿入または削除するには、一定の償却時間がかかります。他の場所からアイテムを挿入または削除するには、線形時間がかかります。これらはベクターの基本です。彼らにはもっとたくさんあります。ほとんどの場合、ベクトルはCスタイルの配列よりも最初の選択肢です。まず第一に、それらは動的にサイズ設定されます。つまり、必要に応じて拡張できます。C配列の場合のように、最適な静的サイズを見つけるためにあらゆる種類の調査を行う必要はありません。ベクトルは必要に応じて拡大し、必要に応じて手動でサイズを変更できます。次に、ベクトルはatメンバー関数で境界チェックを提供します(ただし、operator[])、単にプログラムのクラッシュを監視するのではなく、存在しないインデックスを参照する場合、またはさらに悪いことに、破損したデータを使用して実行を継続できるようにするためです。 — C ++クックブック
111 c++  arrays  vector 

7
std :: vector要素は連続していることが保証されていますか?
私の質問は単純です:std :: vector要素が連続していることが保証されていますか?つまり、std :: vectorの最初の要素へのポインタをC配列として使用できますか? 私の記憶がうまく機能するなら、C ++標準はそのような保証をしませんでした。ただし、std :: vectorの要件は、要素が隣接していない場合、要件を満たすことが実質的に不可能であるようなものでした。 誰かがこれを明確にできますか? 例: std::vector<int> values; // ... fill up values if( !values.empty() ) { int *array = &values[0]; for( int i = 0; i < values.size(); ++i ) { int v = array[i]; // do something with 'v' } }
111 c++  vector  standards 

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