お世話になります。
vector型のコンテナを、erace()関数を用いて、特定の位置の要素を削除した場合
配列長が変化してしまうのは仕様なのでしょうか?
プロトタイプ
private:
vector<string> container;
static const int maximum = 5;
};
// コンストラクタ
***() : container( maximum )
{
}
// 実装
container.push_back( aaa );
container.push_back( bbb );
container.push_back( ccc );
container.push_back( ddd );
container.push_back( eee );
int delpos; //削除したい位置
ccontainer.erase( container.begin() + delpos );
┏━━━┓ ┏━━━┓
┃ aaa ┃ ┃ aaa ┃
┣━━━┫ ┣━━━┫
┃ bbb ┃ ┃ bbb ┃
┣━━━┫ ┣━━━┫
┃ ccc ┃ ┃ ┃
┣━━━┫ ┣━━━┫
┃ ddd ┃ ┃ ddd ┃
┣━━━┫ ┣━━━┫
┃ eee ┃ ┃ eee ┃
┗━━━┛ ┗━━━┛
例えば、このようなstring型のvector配列から、cccを削除した場合
配列の要素数は固定長で、上記右図のような振る舞いを期待していたのですが、
下図のように配列の要素が変動し先頭から詰められてしまいます。
┏━━━┓
┃ aaa ┃
┣━━━┫
┃ bbb ┃
┣━━━┫
┃ ddd ┃
┣━━━┫
┃ eee ┃
┗━━━┛
もし、仕様であるならばSTLでこのような実装を行うには、他に方法はございませんでし
ょうか?
以上宜しくお願いいたします。
ピュアに疑問なんだけど、その erase した後には何が入っていれば適切なの?
erase した場所にあったオブジェクトはデストラクト済みなのでアクセスできない。
ということは erase 後には一切のアルゴリズムが適用できなくなるわけだが。
結論:そーいうコンテナは存在しない。
tetrapod さんお世話になります。
>>ピュアに疑問なんだけど、その erase した後には何が入っていれば適切なの?
container[2]の要素にはempty()を望みます。
>>結論:そーいうコンテナは存在しない。
分かりました、外殻は存在するが、要素が何も無い配列もありかなと淡い希望を持ちまし
たが
不可能ということが分かりました(納得したくないですがww)
ありがとうございました。
> container[2]の要素にはempty()を望みます。
empty()というのが何なのかわかりませんが、「空を表す何がしか」を
返すものであるならば
container[2] = empty();
で良いのでは。
empty って何?
・空文字列を保持している string
・デストラクト済み string の残骸
はまったくもって異なるわけで、当該要素を空文字列にしたいのであれば
vector.erase() を使うことは原理的におかしい。
container[2]="; がやりたいことなのではないのか?
使うだけならvectorがどんな物でどういう風に配列を実現しているかを
理解していなくても大丈夫かと言うと実はそういう事は無くて
使う以上は理解して使わないと思った事は実現できません。
今回の質問は正にそういうケースでvectorがどのように配列を実現しているかを
きちんと理解していれば、vecotr.eraseで空の要素が残ると言う発想にはならなかったと
思います。使っているクラスとかの理解が怪しい時はそのクラスについてとことん調べる
癖をつけた方がいいですよ。
みなさんどうもすいませんでした、大いなる勘違いをしてました。