3

std::vector::erase消去する要素の位置を示す単一の反復子、または範囲を示す 2 つの反復子のいずれかを受け入れます。しかし、これを行うことはできません:

std::vector<int> vec = { 1, 2, 3 };
vec.erase(1);

むしろ、次のようなことをする必要があります

vec.erase( vec.begin()+1 );

これは不必要な余分な作業のように思えます。クラス設計の POV から、このオーバーロードが含まれない理由があるのでしょうか?

編集:最も包括的な回答を選択しました。すべてが良かったです。また、私がこれを書いているとき、この投稿には「建設的ではない」という点で 4 票の票があります。ただし、回答の質を考えると、これは明らかに有用な質問だったと思います。確かに私にとっては.

4

3 に答える 3

2

あなたが持っていた場合を想像してみてください

typedef std::set<int> MyContainer
MyContainer c;
// ...
c.erase(5);  // Or a programmatic int

これで、MyContainerの基になるコンテナを(を更新してtypedefvector突然erase変更すると、セマンティックの意味が完全に変更され、コンパイルされます。このような単純なコンテナタイプの変更によって、このような異なる動作が発生するケースは他に考えられません。

これを回避するにeraseは、値またはイテレータ入力のみを使用し、インデックスを作成しないでください。

于 2012-09-17T21:12:46.940 に答える
2

私の理解では、stl はインデックスと整数を (意味的に) 同じものではないため、それらを分離したいと考えています。また、抽象化にも役立ちます。多くの場合、整数はインデックスとして機能しますが、意味をなさない場合もあります。

于 2012-09-17T20:31:21.090 に答える
1

私が考えることができる2つの理由があります:

1)eraseはコンテナーの共通メンバー関数です。インデックスの使用は一部のコンテナーでのみ意味があるため、イテレーターを使用することで、作業中のコンテナーのタイプを気にする必要がなくなります。たとえば、インデックスはランダム アクセス コンテナーに対してのみ意味があり、反復子を使用してコードをより柔軟にするなどです。

2) 、、などeraseの標準アルゴリズムでうまく機能します。インデックス番号をハードコーディングするよりも、述語などに基づいて要素を消去したい方がはるかに一般的です。詳細については、「erase-remove idiom」を参照してください。std::removestd::remove_ifstd::unique

基本的に、反復子は多くの理由でインデックス作成よりも優れていると考えられており、C++ 標準ライブラリで広く使用されていることがわかります。インデックスは、シミュレートされた配列アクセス用に提供されるマージです。

于 2012-09-17T21:23:25.313 に答える