在這里總結(jié)下可替代循環(huán)的區(qū)間成員函數(shù)和區(qū)間算法;
相比單元素遍歷操作,使用區(qū)間成員函數(shù)的優(yōu)勢(shì)在于:
1)更少的函數(shù)調(diào)用
2)更少的元素移動(dòng)
3)更少的內(nèi)存分配
在區(qū)間成員函數(shù)不適用的情況下也應(yīng)該使用區(qū)間算法,至少,相比手寫循環(huán)而言,它更加簡(jiǎn)單,有效,并且不容易出錯(cuò);
區(qū)間成員函數(shù)
區(qū)間構(gòu)造
標(biāo)準(zhǔn)容器都支持區(qū)間構(gòu)造函數(shù):
例如:
以上是c++98中常用法,在C++11中,vector可以直接初始化了:
或者:
區(qū)間插入
標(biāo)準(zhǔn)序列容器提供這種形式的insert:
例如:
關(guān)聯(lián)容器也支持區(qū)間插入,但由于其插入后的位置由其比較函數(shù)來(lái)決定,所以沒有區(qū)間插入的位置這個(gè)參數(shù);
區(qū)間刪除
標(biāo)準(zhǔn)序列容器提供的erase:
iterator container::erase(iterator begin, iterator end);
c++98的標(biāo)準(zhǔn)關(guān)聯(lián)容器提供的erase為:
void container::erase(iterator begin, iterator end);
序列容器調(diào)用erase之后,返回一個(gè)迭代器(被刪除的那個(gè)元素的下一個(gè)),
而關(guān)聯(lián)容器的erase刪除之后并不返回迭代器.【官方解釋說(shuō)如果實(shí)現(xiàn)成序列容器那樣返回指向下一個(gè)迭代器,會(huì)導(dǎo)致無(wú)法接收的性能下降】;
這一區(qū)別在c++11中終于統(tǒng)一了;c++11中,對(duì)關(guān)聯(lián)容器調(diào)用erase之后會(huì)返回一個(gè)迭代器(指向被刪除元素的下一個(gè));
iterator container::erase(const_iterator first, const_iterator last);
區(qū)間賦值
所有標(biāo)準(zhǔn)容器提供了區(qū)間賦值的成員函數(shù):
void container::assign(InputIterator begin, InputIterator end);
這個(gè)函數(shù)用于給容器賦值,會(huì)替代現(xiàn)有值,并根據(jù)需要分配空間;
與copy()算法的區(qū)別在于它不需要預(yù)先分配空間,并有更高的性能;
通用區(qū)間算法
for_each 區(qū)間迭代
for_each:遍歷,對(duì)每個(gè)元素都執(zhí)行一個(gè)動(dòng)作;
C++98只支持最原始的for循環(huán),很多語(yǔ)言(java、python等)都實(shí)現(xiàn)了foreach區(qū)間迭代語(yǔ)法,這讓C++程序員眼饞了很久;
在沒有foreach區(qū)間迭代的時(shí)代,我們可以用for_each()算法來(lái)代替:
例:對(duì)每個(gè)元素都加5:
c++11中新增了區(qū)間迭代,使得我們對(duì)for_each的依賴降低了,使用也更加方便:
transform() 區(qū)間迭代后新值另存為其它地方
對(duì)區(qū)間中每個(gè)元素執(zhí)行操作后,將修改后的值寫入到新區(qū)間中;
可以認(rèn)為這個(gè)是for_each()算法不修改原區(qū)間的版本;
還是for_each中的例子:
copy() 區(qū)間復(fù)制
區(qū)間復(fù)制,一般用于多個(gè)容器間的數(shù)據(jù)傳值;
這個(gè)算法被用的很普遍,其實(shí),很多使用copy的場(chǎng)景,都可以使用區(qū)間成員函數(shù)來(lái)替代(也建議這么做);
例:復(fù)制數(shù)組到vector:
fill() 區(qū)間填充
用一個(gè)元素來(lái)重復(fù)填充區(qū)間;
這個(gè)算法使用頻率較低;
例:用5填充vector前4個(gè)元素:
replace() 區(qū)間替換
遍歷區(qū)間,進(jìn)行值替換:
例:將以下區(qū)間中所有20替換為99:
更復(fù)雜的版本(使用仿函數(shù))replace_if
例:將以下區(qū)間中所有大于20替換為99:
由于用到了仿函數(shù),通過replace_if實(shí)現(xiàn)的,用for_each()也很容易實(shí)現(xiàn);
remove() 區(qū)間刪除
從區(qū)間中刪除指定元素;
注意,remove并不會(huì)真正刪除元素,而只是將需要?jiǎng)h除的元素放到到最后,同時(shí)返回一個(gè)新的尾部迭代器,
比如,上述例子中,調(diào)用完remove后,vector中的值一般為 //10 30 30 10 10 10 10 20
而如果希望真的刪除元素,需要加上成員函數(shù)erase()來(lái)實(shí)現(xiàn)刪除 【remove-erase慣用法】:
unique() 區(qū)間去重
從區(qū)間中刪除相鄰相同的元素,同樣,這個(gè)算法也不會(huì)真正的刪除元素,而是將待刪除的元素移到區(qū)間尾部;
使用【unique-erase慣用法】:
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
新聞熱點(diǎn)
疑難解答
圖片精選