3

私は疑問に思っていましたが、C ++での設計上の決定が、stdライブラリコンテナのいずれにも純粋な抽象クラスを持たない理由はありますか?

hash_mapが後でstdext名前空間から来たが、非常によく似たインターフェースを共有していることを感謝します。後で特定のソフトウェア用に独自のマップを実装することにした場合は、何らかのインターフェイスを使用することをお勧めします。

std::base_map *foo = new std::map<std::string, std::string>;
delete foo;
foo = new stdext::hash_map<std::string, std::string>;

明らかに、私が知る限り、上記の例は不可能ですが、これはリストや他のstdlibコンテナーでも同様です。

これはC#またはJavaではないことを理解していますが、C ++には明らかにこの設計を停止する制約がないため、同様のコンテナー間に結合がないようにこのように設計されたのはなぜですか。

4

1 に答える 1

2

仮想関数はオーバーヘッドを追加するためです。

コンテナはすべて同じインターフェイスを備えているわけではないため、共通の機能がありますが、イテレータの無効化とメモリ割り当て(および例外の動作)に関する重要な違いもあります。抽象ベースを使用している場合は、理解する必要があります。コンクリートコンテナがどのように動作するかの詳細。

渡されるコンテナーのタイプに依存しないコードを記述したい場合は、C ++では、抽象インターフェースに依存する代わりにテンプレートを記述します。つまり、動的ポリモーフィズムではなく静的ポリモーフィズムを使用します。これにより、動的ディスパッチのオーバーヘッドが回避され、具体的なタイプはコンパイル時に認識されるため、具体的なタイプに基づく特殊化も可能になります。

最後に、私見では何の利点もありません。それはそれがそうであるように良いです。あなたが言うように、これはありがたいことに、C#やJavaではありません。

(PSstdext名前空間はC++の一部ではありません。これは、非標準タイプのMicrosoftの名前空間のようです。より良い例では、std::tr1::unordered_mapまたはstd::unordered_mapの代わりに使用しますstdext::hash_map

于 2013-02-23T13:20:58.827 に答える