Aritalab:Lecture/Programming/Cpp/Tips
From Metabolomics.JP
< Aritalab:Lecture | Programming | Cpp(Difference between revisions)
m (New page: ==プログラムのコツ== ; <tt>out << "\n"</tt>と、<tt>out << endl</tt> の違い <tt>out << endl</tt> と書くと <pre> out << "\n"; out.flush(); </pre> と同じことになる...) |
|||
Line 1: | Line 1: | ||
− | ==プログラムのコツ== | + | ==C++プログラムのコツ== |
; <tt>out << "\n"</tt>と、<tt>out << endl</tt> の違い | ; <tt>out << "\n"</tt>と、<tt>out << endl</tt> の違い | ||
Line 10: | Line 10: | ||
; イテレータのインクリメントは前置にする | ; イテレータのインクリメントは前置にする | ||
− | <tt>for(vector<string>::iterator itr=V.begin(); itr != V.end(); ++itr)</tt>のようなコードを書く際に、<tt>itr++</tt> | + | <tt>for(vector<string>::iterator itr=V.begin(); itr != V.end(); ++itr)</tt>のようなコードを書く際に、<tt>itr++</tt>と書かないのには理由があります。 |
− | + | 基本データ型でない場合、インクリメント演算子の定義は以下のようになります。戻り値の型に注意してください。後置オペレータは処理の後にインクリメントするため、返り値がインクリメントする前の状態にしないといけません。 | |
<pre> | <pre> | ||
iterator operator++(int) | iterator operator++(int) | ||
− | { | + | { //後置 |
iterator _Tmp = *this; | iterator _Tmp = *this; | ||
++*this; | ++*this; | ||
Line 21: | Line 21: | ||
iterator& operator++() | iterator& operator++() | ||
− | { | + | { //前置 |
++*this; | ++*this; | ||
return *this; | return *this; | ||
} | } | ||
</pre> | </pre> | ||
+ | このためオーバーロードする関数の中でコピーコンストラクタによるオブジェクトの作成と、作成したオブジェクトを戻す際に再びコピーと、余分にオブジェクトが作成されるのです。 | ||
+ | こうした余分な処理を含まないため、前置インクリメントを使います。(ただし、基本データタイプについてはどちらでも同じです。) |
Revision as of 20:25, 7 October 2010
C++プログラムのコツ
- out << "\n"と、out << endl の違い
out << endl と書くと
out << "\n"; out.flush();
と同じことになるため、頻繁に利用する場合は前者のほうが効率が良い。
- イテレータのインクリメントは前置にする
for(vector<string>::iterator itr=V.begin(); itr != V.end(); ++itr)のようなコードを書く際に、itr++と書かないのには理由があります。 基本データ型でない場合、インクリメント演算子の定義は以下のようになります。戻り値の型に注意してください。後置オペレータは処理の後にインクリメントするため、返り値がインクリメントする前の状態にしないといけません。
iterator operator++(int) { //後置 iterator _Tmp = *this; ++*this; return _Tmp; } iterator& operator++() { //前置 ++*this; return *this; }
このためオーバーロードする関数の中でコピーコンストラクタによるオブジェクトの作成と、作成したオブジェクトを戻す際に再びコピーと、余分にオブジェクトが作成されるのです。 こうした余分な処理を含まないため、前置インクリメントを使います。(ただし、基本データタイプについてはどちらでも同じです。)