Aritalab:Lecture/Programming/Cpp/Tips

From Metabolomics.JP
< Aritalab:Lecture | Programming | Cpp(Difference between revisions)
Jump to: navigation, search
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&#43;&#43;プログラムのコツ==
  
 
; <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(); &#43;&#43;itr)</tt>のようなコードを書く際に、<tt>itr&#43;&#43;</tt>と書かない理由。
+
<tt>for(vector<string>::iterator itr=V.begin(); itr != V.end(); &#43;&#43;itr)</tt>のようなコードを書く際に、<tt>itr&#43;&#43;</tt>と書かないのには理由があります。
基本データ型でない場合、インクリメント演算子の定義は以下のようになります。
+
基本データ型でない場合、インクリメント演算子の定義は以下のようになります。戻り値の型に注意してください。後置オペレータは処理の後にインクリメントするため、返り値がインクリメントする前の状態にしないといけません。
 
<pre>
 
<pre>
 
iterator operator&#43;&#43;(int)
 
iterator operator&#43;&#43;(int)
{
+
{ //後置
 
   iterator _Tmp = *this;
 
   iterator _Tmp = *this;
 
   &#43;&#43;*this;
 
   &#43;&#43;*this;
Line 21: Line 21:
  
 
iterator& operator&#43;&#43;()
 
iterator& operator&#43;&#43;()
{
+
{ //前置
 
 &#43;&#43;*this;
 
 &#43;&#43;*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;
}

このためオーバーロードする関数の中でコピーコンストラクタによるオブジェクトの作成と、作成したオブジェクトを戻す際に再びコピーと、余分にオブジェクトが作成されるのです。 こうした余分な処理を含まないため、前置インクリメントを使います。(ただし、基本データタイプについてはどちらでも同じです。)

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox