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

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

2
カスタムクラスタイプをキーとして使用するC ++ unordered_map
unordered_map次のように、カスタムクラスをのキーとして使用しようとしています。 #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; class node; class Solution; class Node { public: int a; int b; int c; Node(){} Node(vector<int> v) { sort(v.begin(), v.end()); a = v[0]; b = v[1]; c = v[2]; } bool operator==(Node i) { if ( i.a==this->a && i.b==this->b &&i.c==this->c …


5
C ++でのstd :: vectorとstd :: arrayの比較
C ++でのstd::vectorとの違いは何std::arrayですか?いつ他の人よりも好まれるべきですか?それぞれの長所と短所は何ですか?私の教科書がしていることは、それらがどのように同じであるかをリストすることだけです。
283 c++  arrays  vector 



18
nullで終了する文字列の根拠は何ですか?
私はCとC ++が大好きですが、ヌル終了文字列の選択に頭を悩まさずにはいられません。 Cの前に存在する長さの接頭辞付きの(つまりPascal)文字列 長さの接頭辞付き文字列は、一定時間の長さのルックアップを可能にすることにより、いくつかのアルゴリズムを高速化します。 長さの接頭辞付き文字列により、バッファオーバーランエラーが発生しにくくなります。 32ビットマシンでも、文字列が使用可能なメモリのサイズになるようにすると、長さの接頭辞付き文字列は、ヌル終了文字列よりも3バイトだけ広くなります。16ビットマシンでは、これは1バイトです。64ビットマシンでは、4GBが適切な文字列長の制限ですが、それをマシンワードのサイズに拡張したい場合でも、64ビットマシンは通常、十分なメモリを備えており、余分な7バイトのnull引数になります。元のC標準がめちゃくちゃ貧弱なマシン(メモリの観点から)向けに作成されたのは知っていますが、効率性の問題でここでは売れません。 他のほとんどすべての言語(Perl、Pascal、Python、Java、C#など)は、長さの接頭辞付き文字列を使用します。これらの言語は文字列の方が効率的であるため、通常、文字列操作のベンチマークでCに勝っています。 C ++はこれをstd::basic_stringテンプレートで少し修正しましたが、nullで終了する文字列を期待するプレーンな文字配列はまだ普及しています。ヒープの割り当てが必要なため、これも不完全です。 nullで終了する文字列は、文字列に存在できない文字(つまりnull)を予約する必要がありますが、長さの接頭辞付きの文字列には埋め込みnullを含めることができます。 これらの事柄のいくつかはCよりも最近明らかになったので、Cがそれらを知らなかったのは理にかなっています。しかし、Cが登場する前に、いくつかは明白でした。明らかに優れた長さの接頭辞の代わりにnullで終了する文字列が選択されたのはなぜですか? 編集:一部の人は上記の私の効率の点で事実を尋ねました(そして私がすでに提供したものを好きではありませんでした)ので、それらはいくつかのことに由来します: nullで終了する文字列を使用した連結では、O(n + m)時間の複雑さが必要です。多くの場合、長さの接頭辞にはO(m)のみが必要です。 nullで終了する文字列を使用する長さには、O(n)時間の複雑さが必要です。長さの接頭辞はO(1)です。 長さと連結は、最も一般的な文字列操作です。nullで終了する文字列の方が効率的である場合がいくつかありますが、これらはそれほど頻繁には発生しません。 以下の回答から、これらはnullで終了する文字列がより効率的ないくつかのケースです: 文字列の先頭を切り取って、いくつかのメソッドに渡す必要がある場合。元の文字列を破棄することが許可されている場合でも、長さの接頭辞を使用して一定の時間でこれを実際に行うことはできません。長さの接頭辞はおそらく整列規則に従う必要があるためです。 文字列を1文字ずつループしている場合は、CPUレジスタを保存できる場合があります。これは、文字列を動的に割り当てていない場合にのみ機能することに注意してください(その後、文字列を解放する必要があるため、保存したCPUレジスタを使用して、最初にmallocや友人から取得したポインターを保持する必要があります)。 上記のどれも、長さと連結ほど一般的ではありません。 以下の回答にはもう1つ主張があります。 あなたは文字列の終わりを切り取る必要があります しかし、これは正しくありません。nullで終了し、長さの接頭辞が付いた文字列と同じ時間です。(nullで終了する文字列は、新しい終了位置にしたい場所にnullを貼り付け、長さのプリフィックスはプレフィックスから減算するだけです。)
281 c++  c  string  null-terminated 

18
ベクターの内容を印刷する方法は?
C ++でベクトルの内容を出力したいのですが、以下のものがあります。 #include <iostream> #include <fstream> #include <string> #include <cmath> #include <vector> #include <sstream> #include <cstdio> using namespace std; int main() { ifstream file("maze.txt"); if (file) { vector<char> vec(istreambuf_iterator<char>(file), (istreambuf_iterator<char>())); vector<char> path; int x = 17; char entrance = vec.at(16); char firstsquare = vec.at(x); if (entrance == 'S') { path.push_back(entrance); …
281 c++  vector  output  stdvector  cout 


16
C ++構造の初期化
以下に示すようにC ++で構造体を初期化することは可能ですか struct address { int street_no; char *street_name; char *city; char *prov; char *postal_code; }; address temp_address = { .city = "Hamilton", .prov = "Ontario" }; こことここのリンクは、このスタイルをCでのみ使用できることを述べています。もしそうなら、なぜC ++ではこれができないのですか?C ++で実装されていない根本的な技術的な理由はありますか、またはこのスタイルを使用することは悪い習慣ですか?私の構造体は大きく、このスタイルにより、どのメンバーにどの値が割り当てられているかが明確にわかるため、この初期化方法を使用するのが好きです。 同じ読みやすさを実現する方法が他にある場合は、教えてください。 この質問を投稿する前に、次のリンクを参照しました C / C ++ for AIX 変数によるC構造体の初期化 C ++でのタグによる静的構造の初期化 C ++ 11の適切な構造の初期化
278 c++ 

9
なぜ乱数ジェネレーターを使用するときにモジュロバイアスがあると人々は言うのですか?
私はこの質問が頻繁に尋ねられるのを見ましたが、それに対する真の具体的な答えを見たことはありません。そこでrand()、C ++のように乱数ジェネレータを使用するときに「モジュロバイアス」が正確に存在する理由を人々が理解できるように役立つものをここに投稿します。

17
プライベートおよび保護されたメンバー:C ++
privateとprotectedクラスのメンバーの違いについて誰かに教えてもらえますか? 私はクラスの外と呼ばれていない変数や関数がなされるべきであることを、ベストプラクティスの規則から理解privateが、私を見て- MFCのプロジェクト、MFCが賛成に思えますprotected。 違いは何ですか?どちらを使用すればよいですか?
276 c++  class  mfc 

13
malloc()とfree()はどのように機能しますか?
どうやっmallocてfree仕事をしたいのか知りたい。 int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout << p; free(p); // Obvious Crash, but I need how it works and why crash. cout << p; return 0; } 可能であれば、答えがメモリレベルで詳細にある場合、私は本当に感謝します。

8
C ++でのmake_sharedと通常のshared_ptrの違い
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo")); 多くのグーグルとスタックオーバーフローの投稿がこれにありますがmake_shared、直接使用するよりもなぜ効率的であるのか理解できませんshared_ptr。 誰かが私にどのようmake_sharedに効率的であるかを理解できるように、作成されたオブジェクトのシーケンスと両方で行われた操作を順を追って説明してくれませんか?参考のために、上記の例を1つ示しました。
276 c++  c++11  shared-ptr 

23
重複を消去してベクターをソートする最も効率的な方法は何ですか?
潜在的に多くの要素を持つC ++ベクトルを取得し、重複を消去して、並べ替える必要があります。 現在、以下のコードがありますが、機能しません。 vec.erase( std::unique(vec.begin(), vec.end()), vec.end()); std::sort(vec.begin(), vec.end()); これを正しく行うにはどうすればよいですか? さらに、最初に重複を消去する(上記のコードと同様)か、ソートを最初に実行する方が高速ですか?最初にソートを実行した場合、std::unique実行後もソートされたままになることが保証されますか? または、これをすべて行う別の(おそらくより効率的な)方法はありますか?
274 c++  sorting  vector  stl  duplicates 

11
C ++で新しいキーワードを使用する必要があるのはいつですか?
しばらくC ++を使用していて、新しいキーワードについて疑問に思っていました。単に、私はそれを使うべきか、そうでないのか? 1)新しいキーワードで... MyClass* myClass = new MyClass(); myClass->MyField = "Hello world!"; 2)新しいキーワードなし... MyClass myClass; myClass.MyField = "Hello world!"; 実装の観点からは、それらはそれほど異なっていないように見えます(しかし、確かに違います)...しかし、私の主要言語はC#であり、もちろん最初の方法は私が慣れているものです。 問題は、方法1がstd C ++クラスで使用するのが難しいことです。 どの方法を使用する必要がありますか? 更新1: 私は最近、スコープから外れる(つまり、関数から返される)大きな配列のヒープメモリ(またはfree store)に新しいキーワードを使用しました。以前はスタックを使用していたため、要素の半分がスコープ外で破損していましたが、ヒープの使用に切り替えることで、要素が正常に機能するようになりました。わーい! アップデート2: 私の友人は最近、newキーワードを使用するための簡単なルールがあると私に言った。タイプするたびにnew、タイプしてくださいdelete。 Foobar *foobar = new Foobar(); delete foobar; // TODO: Move this to the right place. これは、常に削除をどこかに置く必要があるため(つまり、切り取りしてデストラクタなどに貼り付ける場合)、メモリリークを防ぐのに役立ちます。

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