CまたはC++はC/C++ではありません
C++はC/C++ではありません.現在、多くの会社のプログラマーはC/C++プログラマーです.問:C/C++はどんな言語ですか.答え:CにはC++があり、C++にはCがあります.たとえば、次のコードがあります.
int b[256];
memset(b, 0, sizeof(b));
for (int i = 0; i < 1000000; ++i)
{
for (size_t j = 0; j < 256U; ++j)
{
b[j] = 10 * j;
}
}
一.まだ元の配列を使ってるの?なぜvectorがあったのか分からないが、多くの人がC++コードを書くのか、それとも元の配列を使うのか.(何らかの理由でvectorが使えない?)
vectorがもたらすメリットを見てみましょう.
1.定義すれば、上の1行目と2行目を初期化できるのは明らかにstd::vector
2.vector変数にはsize長があり、ループ時に境界を越えにくい.
3.vectorとその便利な長さの変更(resize).元の配列が長さが足りない場合は、1つを再定義し、手動で新しい配列にコピーしなければなりません.面倒で死にます.カプセル化すれば、実際にvectorがやったことをもう一度やった.
もちろんvector機能はそれだけではありませんが、今回は元の配列に代わるメリットについて議論します.
上段のコードは次のように置き換えられます.
std::vector<int> a(256, 0);
for (int i = 0; i < 1000000; ++i)
{
for (size_t j = 0; j < a.size(); ++j)
{
a[j] = 10 * j;
}
}
効率は?vectorの中も原始配列で、1層パッケージされていて、原始配列より遅くないのではないでしょうか.私も最初はそう思っていましたが、テストの結果は私の予想を大きく上回っていました.
以上の2つのコードをテストしてみましたが、元の配列は少し遅いです.コンパイラはg++4.3.2-O 2最適化
vectorバージョン249 ms
元の配列バージョン251 ms
二.まだ関数ポインタを使っていますか.残念ながら、C言語は設計時に関数が第1クラスの値に設計されているわけではありません.C++は最初はありませんでしたが、boost::function(標準ライブラリに追加され、std::function)が現れてから、C++の関数は基本的に第1のクラスの値として使用できます.
int g(int a)
{
return a * 10;
}
int f(std::function<int (int)> callback, int a)
{
return callback(a);
}
std::function<int (int)> callback = g;
f(callback, 1000);
C , C 。C++ 。
std::function lambda std::bind ,C++
int g(shared_ptr<int> count)
{
return ++(*count);
}
int f()
{
std::function<int (void)> counter = std::bind(&g, std::make_shared<int>(0));
std::cout << count();
std::cout << count();
}
雲風は彼のブログで、閉鎖的な言語がないのは苦痛で、彼は何とかC言語に閉鎖を加えたいと言った.なぜC++を使わないのかと言いたいのですが.
三.まだnewポインタにいますか?針は核兵器で,敵を千人殺して八百を自傷した.時には針が伝わってきて、最後に釈放を忘れた.スマートポインタの出現はC++一度の飛越である.
auto a = std::make_shared
shared_ptrは万能良薬ではなく、不適切な使用はより深刻な結果をもたらす.たとえば、メモリリークツールでもチェックできません.だから、share_ptrがもたらすのは文法的なツールであり、変数のライフサイクルをより明確にする必要があります.
C言語は偉大な言語であり、完璧な言語であることを意味しない.C++はそれに対して多くの改善があって、私达はC++を使う时その精華を取って、その粕を取り除くことができます.