STL之Ranges區間討論

2022-09-08 10:54:10 字數 2111 閱讀 2782

stl裡的演算法用來處理乙個或多個區間內的元素,這樣的區間可以涵蓋容器內的全部元素,但非強制要求。為了得以操作容器元素的某個子集,我們必須將區間首尾當做兩個引數傳遞給演算法。需要注意的是呼叫者需要保證由這個兩個引數定義出來的區間是有效的。有效性是指,從起點出發,逐一前進,能夠到達終點。即呼叫者必須確保兩個迭代器隸屬於同乙個容器,而且前後位置放置正確。

stl演算法所處理的都是半開區間(half-open ranges),包括起始位置元素但不包括結尾元素位置。表示式:[begin, end).

半開半並區間的由以下優點:

1.為「遍歷元素時,迴圈的結束時機」提供了乙個簡單的判斷依據。迭代器未到達end(),還可以繼續遍歷

2.不必為空區間採取特殊處理,空區間時begin()= end()。

不利的的地方:

1.可能會對乙個空區間採取操作,但編譯器不會去檢查 比如:reverse(ivec.begin(), ivec.begin());

2.需要注意到stl演算法不會處理尾元素,容器造成「少1」的情況,儘管不會報錯。

int _tmain(int argc, _tchar* ar**)

pos25 = find(ilist.begin(), ilist.end(), 25);

pos35 = find(ilist.begin(), ilist.end(), 35);

cout << "max: " << *max_element(pos25, pos35) << endl; //exclude pos35, max number = 34

cout << "max: " << *max_element(pos25, ++pos35) << endl;//include pos35, max number = 35

//ilist儲存數字:20 21 22 ...40,順序為遞增的方式,25 一定在 35的前面

//因此[pos25, pos35)list::iterator迭代器++能夠到達 pos35,該區間是有效的

return 0;

}

例子1中我們我們知道 pos25 一定在pos35之前,因此[pos25, pos35)是個有效區間。假設 我們不清楚pos25 或者pos35的前後關係,甚至它們是否存在都不清楚,我們就需要確定區間的有效性,否則會導致未定義行為,現在分幾種情況進行討論和確定區間有效性的方法。

if (pos25 < pos35)

else if (pos35 < pos25)

else

pos25 = find(ilist.begin(), ilist.end(), 25);

pos35 = find(ilist.begin(), pos25, 35);

if (pos35 != pos25)

else

else

}

stl演算法中需要同時處理多個區間。通常情況下必須設定第乙個區間的起點和終點,對於其他區間只需要設定起點即可,其他區間的終點可由第乙個區間的元素數量推倒出來。特別需要注意的地方是:

某個演算法用來處理多個區間時,務必需要確保第二個之後的區間所擁有的個數,至少和第乙個區間的元素相同。特別是執行塗寫動作(賦值)時,務必確保目標區間有足夠的大小。

如下**程式就會奔潰:

int _tmain(int argc, _tchar* ar**)

copy(ilist.begin(), ilist.end(), ivec.begin());//執行塗寫操作,目標區間為0,執行奔潰

return 0;

}

若想避免以上錯誤,可以採用兩種方式,但這兩種方式只適用於序列式容器(vector,deques,list):

1.確認目標空間有足夠的大小

2.採用安插型迭代器

形如如下程式:

int _tmain(int argc, _tchar* ar**)

方式一

copy(ilist.begin(), ilist.end(), back_inserter(ivec));//方式二:採用迭代器 back_inserter

for (int i = 0; i < 6; i++)

{ cout << i + 1 <<"th:" << ivec[i] <

STL容器迭代器失效問題討論

vector迭代器的幾種失效的情況 1 當插入 push back 乙個元素後,end操作返回的迭代器肯定失效。23 當進行刪除操作 erase,pop back 後,指向刪除點的迭代器全部失效 指向刪除點後面的元素的迭代器也將全部失效。deque迭代器的失效情況 在c primer一書中是這樣限定...

區間排程之區間 合併

思路按照區間的左端點,右端點從小道大排序。遍歷每乙個區間,若當前區間curr.start last.end,證明區間有可能有交集,需要更新上乙個區間last.end的值。若curr.start last.end 證明兩個區間不可能有交集。include include include using n...

HDU5881 區間的討論

1.題目鏈結。題目大意 有乙個水壺和兩隻水杯,給出水壺體積的區間 l,r 現在把水壺中的水倒出來,使得兩隻水杯中的水的體積相差不超過1,水壺中留下的水的體積也不超過1.求出最少需要多少不能夠完成這個操作。2.emmm,乙個分析題。直接分析一些這個區間的上下界和區間的長度,分類是挺多的,不容易想全。但...