Vector的應用 帶刪除標記的vector

2021-10-10 20:29:29 字數 2596 閱讀 8570

在正規表示式識別的過程中,需要同時跟蹤多個正規表示式的識別狀態。最自然的做法是用n個元素的指標陣列同時跟蹤n個識別路徑。當輸入的字元跟識別路徑上接受的輸入不符時,這一路的指標失效。當識別路徑上遇到ε字元時,這一路的指標發生分叉。

stl的vector 能有效的進行自動管理記憶體,比較適合用來儲存這種個數不確定的動態指標陣列。為了最小化刪除乙個指標在陣列內產生的移動開銷,使用乙個刪除標記來管理失效的指標。

這是對stl的vector 改造後的實現:

#include

using

namespace std;

template

<

class

t>

struct item

;template

<

class

t>

class

myvector

; vector

> v;

int max;

myvector()

t &operator

(int n)

throw

"out of range error";}

void

(t t)

else

}class

iterator

; iterator end()

return i;

} iterator begin()

return i;

}void

pack()

max =i;

}class

iterator

iterator()

iterator

(vector

>

*v,const

typename vector

>

::iterator &it):v

(v),

it(it)

iterator &

operator=(

const iterator& itt)

iterator &

operator++(

)}return

*this;}

t operator*(

) t*

operator

->()

void

del(

)bool

operator!=(

const iterator & r)};

};

iterator的del()操作,對vector裡面的元素進行刪除標記。刪除後的元素,用[index]索引還能看到,但用iterator訪問已經被遮蔽了。直到vector呼叫pack()操作,批量的把失效指標去掉。

下面是測試**,用乙個int 來代替指標:

int

main()

it = mv.

begin()

; i=0;

while

(it!= mv.

end())

}printf

("\n");

it = mv.

begin()

;while

(it!= mv.

end())

printf

("\n");

vectorint>

>

::iterator index;

item<

int> val;

index = mv.v.

begin()

;while

(index!=mv.v.

end())

printf

("\n");

mv.pack()

; index = mv.v.

begin()

;while

(index!=mv.v.

end())

printf

("\n");

return0;

}

可以看到如下的執行結果,這正是所需要的。

100

101102

103104

105106

107108

109100

101102

103104

105106

107108

109100

102104

106108

100(0)

101(1)

102(0)

103(1)

104(0)

105(1)

106(0)

107(1)

108(0)

109(1)

100(0)

102(0)

104(0)

106(0)

108(0)

105(1)

106(0)

107(1)

108(0)

109(

1)

帶刪除的優先佇列(延緩刪除,加標記)

本文就不講優先佇列的基本用法了,主要講一下怎麼加標記。具體的應用環境就是給你乙個佇列 或者棧 不斷的加入元素,同時也有可能刪除元素,同時還可能詢問這個佇列裡面的最大值。你求最大值是不能去直接遍歷的,因為會超時,這樣就只能用優先佇列加標記了。具體的做法是 維護兩個優先佇列,乙個是最大值佇列,乙個是刪除...

vector的應用舉例

1 問題描述 近來寫程式的時候,用到了容器,所以對這個操作進行了一些了解和操作。2 的迭代器的相關函式。表1 vectors的迭代器相關函式 操作 效果c.begin 返回乙個隨機訪問迭代器,指向第乙個元素 c.end 返回乙個隨機訪問迭代器,指向最後元素的下乙個位置 c.rbegin 返回乙個隨機...

vector向量容器的刪除

erase 方法可以刪除vector中迭代器所指的乙個元素或一段區間中所有元素。clear 方法則一次性刪除vector中所有的元素。include includeusing namespace std int main int argc,char argv v.erase v.begin 2 刪除...