vector型の固定長コンテナの実装 – プログラミング – Home

vector型の固定長コンテナの実装
 
通知
すべてクリア

[解決済] vector型の固定長コンテナの実装


ソイレントグリーン
 ソイレントグリーン
(@ソイレントグリーン)
ゲスト
結合: 17年前
投稿: 65
Topic starter  

お世話になります。
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でこのような実装を行うには、他に方法はございませんでし
ょうか?
以上宜しくお願いいたします。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

ピュアに疑問なんだけど、その erase した後には何が入っていれば適切なの?

erase した場所にあったオブジェクトはデストラクト済みなのでアクセスできない。
ということは erase 後には一切のアルゴリズムが適用できなくなるわけだが。

結論:そーいうコンテナは存在しない。


返信引用
ソイレントグリーン
 ソイレントグリーン
(@ソイレントグリーン)
ゲスト
結合: 17年前
投稿: 65
Topic starter  

tetrapod さんお世話になります。
>>ピュアに疑問なんだけど、その erase した後には何が入っていれば適切なの?
container[2]の要素にはempty()を望みます。


返信引用
ソイレントグリーン
 ソイレントグリーン
(@ソイレントグリーン)
ゲスト
結合: 17年前
投稿: 65
Topic starter  

>>結論:そーいうコンテナは存在しない。
分かりました、外殻は存在するが、要素が何も無い配列もありかなと淡い希望を持ちまし
たが
不可能ということが分かりました(納得したくないですがww)
ありがとうございました。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

> container[2]の要素にはempty()を望みます。

empty()というのが何なのかわかりませんが、「空を表す何がしか」を
返すものであるならば

container[2] = empty();

で良いのでは。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

empty って何?
・空文字列を保持している string
・デストラクト済み string の残骸
はまったくもって異なるわけで、当該要素を空文字列にしたいのであれば
vector.erase() を使うことは原理的におかしい。
container[2]="; がやりたいことなのではないのか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

使うだけならvectorがどんな物でどういう風に配列を実現しているかを
理解していなくても大丈夫かと言うと実はそういう事は無くて
使う以上は理解して使わないと思った事は実現できません。

今回の質問は正にそういうケースでvectorがどのように配列を実現しているかを
きちんと理解していれば、vecotr.eraseで空の要素が残ると言う発想にはならなかったと
思います。使っているクラスとかの理解が怪しい時はそのクラスについてとことん調べる
癖をつけた方がいいですよ。


返信引用
ソイレントグリーン
 ソイレントグリーン
(@ソイレントグリーン)
ゲスト
結合: 17年前
投稿: 65
Topic starter  

みなさんどうもすいませんでした、大いなる勘違いをしてました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました