C/C++面接問題

2122 ワード

1.反復器とポインタ
STL containerクラスのiteratorのみを議論する場合、それらは実際には汎用ポインタです.Cスタイルポインタはiteratorの一種です.iteratorは機能によってさらに細かく分けられ、STLのiteratorは5種類に分けられています.違いは次のように思います.
範囲上、pointerはiteratorの一種(random access iterator)に属する.
機能上、iteratorはpointerよりも細かく区分され、対応する能力の異なる機能(異なる演算子を再ロード)を持っている.
行動上、iteratorはpointerよりも統一的で良好な用法(begin()、end()をより容易に使用し、境界を越える心配はない)反復器:
(1)反復器はポインタではなく、クラステンプレートであり、ポインタのように表現されている.彼はポインタのいくつかの機能をシミュレートしただけで、->,*オペレータをリロードし、「STL(Standard Template Library)コンテナ内のすべてまたは一部の要素を巡回可能」なオブジェクトであり、異なるタイプのデータ構造に基づいて異なる+、--などの操作を実現することができる.(2)反復器はテンプレートクラスであり,*をリロードしているためcoutは反復器が*を用いて値を取った値しか出力できず,それ自体を直接出力できない.(3)設計モードには反復器モードというモードがあり、簡単に言えば、ある容器の内部表現形式を暴露する必要がない場合に、その容器の各要素に順次アクセスできるようにする方法を提供し、このような設計思考はSTLの中で広く応用され、STLの鍵であり、反復器を通じて、容器とアルゴリズムは有機的に接着することができる.一緒に,アルゴリズムに異なる反復器を与えるだけで,異なる容器に対して同じ操作を行うことができる.注意:反復器は使用後に解放され、これ以上使用できませんが、ポインタはできます!!ポインタ:ポインタは関数を指すことができますが、反復器はできません.反復器は容器を指すしかありません.ポインタは反復器の一種です.ポインタは特定のコンテナにのみ使用できます.反復器はポインタの抽象化と汎化である.したがって、ポインタは反復器のすべての要求を満たします.
要するに、ポインタと反復器には大きな違いがあり、彼らが表現した行為は似ているが、本質は異なる!一つはクラステンプレートで、一つはやつのアドレスを格納するポインタ変数です.
2.C++malloc/freeがあるのに、なぜnew、deleteが必要なの?mallocとfreeはC,C++言語の標準ライブラリ関数であり,new/deleteはC++の演算子である.ダイナミックメモリの申請やメモリの解放に使用されます.内部データ型以外のオブジェクトでは、malloc/freeだけではダイナミックオブジェクトの要件を満たすことはできません.オブジェクトは作成と同時にコンストラクション関数を自動的に実行し、オブジェクトは消滅する前にコンストラクション関数を自動的に実行します.malloc/freeは演算子ではなくライブラリ関数であるため、コンパイラ制御権限内ではなく、コンストラクション関数とコンストラクション関数を実行するタスクをmalloc/freeに押し付けることはできません.したがって、C++言語には、動的メモリ割り当てと初期化作業を完了できる演算子newと、メモリのクリーンアップと解放作業を完了できる演算子deleteが必要です.新/deleteはライブラリ関数ではなく演算子です
3.allocatorのdeallocate&destoryの違いとつながり
「STLソースプロファイル」の単純allocatorによって実装されるソースコードの一部:
template 
	inline void _deallocate(T* buffer)
	{
		::operator delete(buffer);   
		                           
	}
template 
	inline void _destory(T *ptr)
	{
		ptr->~T();
	}

destoryはタイプの構造関数を呼び出し、対応するメモリの内容を破棄する責任を負います(ただし、破棄後もメモリアドレスは保持され、このメモリを利用することもできます).
deallocateは、メモリを解放し(対応するメモリの値がその前にdestory破棄を呼び出すべきである)、メモリアドレスをシステムに返し、このアドレスの一部を参照-1で使用することを意味します.