程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> STL區間成員函數及區間算法總結

STL區間成員函數及區間算法總結

編輯:關於C++

STL區間成員函數及區間算法總結。本站提示廣大學習愛好者:(STL區間成員函數及區間算法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是STL區間成員函數及區間算法總結正文


在這裡總結下可替換輪回的區間成員函數和區間算法;

比擬單位素遍歷操作,應用區間成員函數的優勢在於:
1)更少的函數挪用
2)更少的元素挪動
3)更少的內存分派

在區間成員函數不實用的情形下也應當應用區間算法,至多,比擬手寫輪回而言,它加倍簡略,有用,而且不輕易失足;

區間成員函數

區間結構

尺度容器都支撐區間結構函數:


container::container(InputIterator begin, // 區間的終點
                  InputIterator end); // 區間的起點

例如:


int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);

以上是c++98中經常使用法,在C++11中,vector可以直接初始化了:


std::vector<int> second ={10, 20, 30, 30, 20, 10, 10, 20}; 

或許:


std::vector<int> second ({10, 20, 30, 30, 20, 10, 10, 20});  

區間拔出

尺度序列容器供給這類情勢的insert:


void container::insert(iterator position, // 區間拔出的地位
                    InputIterator begin, // 拔出區間的終點
                    InputIterator end); // 拔出區間的起點

例如:


int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector;
myvector.push_back(100);
myvector.insert(myvector.begin(),myints,myints+8); //10 20 30 30 20 10 10 20 100

聯系關系容器也支撐區間拔出,但因為其拔出後的地位由其比擬函數來決議,所以沒有區間拔出的地位這個參數;

區間刪除

尺度序列容器供給的erase:

iterator container::erase(iterator begin, iterator end);

c++98的尺度聯系關系容器供給的erase為:

void container::erase(iterator begin, iterator end);

序列容器挪用erase以後,前往一個迭代器(被刪除的誰人元素的下一個),
而聯系關系容器的erase刪除以後其實不前往迭代器.【官方說明說假如完成成序列容器那樣前往指向下一個迭代器,會招致沒法吸收的機能降低】;

這一差別在c++11中終究同一了;c++11中,對聯系關系容器挪用erase以後會前往一個迭代器(指向被刪除元素的下一個);

iterator container::erase(const_iterator first, const_iterator last);

區間賦值

一切尺度容器供給了區間賦值的成員函數:

void container::assign(InputIterator begin, InputIterator end);
這個函數用於給容器賦值,會替換現有值,並依據須要分派空間;
與copy()算法的差別在於它不須要事後分派空間,並有更高的機能;


int myints[]={10,20,30,40,50,60,70};
std::vector<int> myvector;
myvector.assign(myints,myints+7);

通用區間算法

for_each 區間迭代

for_each:遍歷,對每一個元素都履行一個舉措;
C++98只支撐最原始的for輪回,許多說話(java、python等)都完成了foreach區間迭代語法,這讓C++法式員眼饞了良久;
在沒有foreach區間迭代的時期,我們可以用for_each()算法來取代:

例:對每一個元素都加5:


void myfunction (int& i) {
    i += 5;
}
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
for_each(myvector.begin(),myvector.end(),myfunction); //15 25 35

c++11中新增了區間迭代,使得我們對for_each的依附下降了,應用也加倍便利:


for(auto &i : myvector )
{
    i+=5;
}

transform() 區間迭代後新值另存為其它處所

對區間中每一個元素履行操作後,將修正後的值寫入到新區間中;
可以以為這個是for_each()算法不修正原區間的版本;
照樣for_each中的例子:


int addfunction(int i ){
    return i+5;
}
void output (int i) {  // output function
    std::cout << ' ' << i;
}
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
std::vector<int> bvector;
bvector.resize(myvector.size());
transform(myvector.begin(),myvector.end(),bvector.begin(),addfunction);
//輸入
for_each(bvector.begin(),bvector.end(),output); //bvector: 15 25 35

copy() 區間復制

區間復制,普通用於多個容器間的數據傳值;
這個算法被用的很廣泛,其實,許多應用copy的場景,都可使用區間成員函數來替換(也建議這麼做);

例:復制數組到vector:


int myints[]={10,20,30,40,50,60,70};
std::vector<int> myvector (7);
std::copy ( myints, myints+7, myvector.begin() );

fill() 區間填充

用一個元從來反復填充區間;
這個算法應用頻率較低;
例:用5填充vector前4個元素:


std::vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0
std::fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0

replace() 區間調換

遍歷區間,停止值調換:
例:將以下區間中一切20調換為99:


int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
std::replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99

更龐雜的版本(應用仿函數)replace_if
例:將以下區間中一切年夜於20調換為99:


bool bigerThen20 (int i) { return i > 20; }
int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
std::replace_if (myvector.begin(), myvector.end(), bigerThen20, 99); //10 20 99 99 20 10 10 20

因為用到了仿函數,經由過程replace_if完成的,用for_each()也很輕易完成;

remove() 區間刪除

從區間中刪除指定元素;


int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
std::remove(myvector.begin(), myvector.end(), 20); // 10 30 30 10 10 ? ? ?

留意,remove其實不會真正刪除元素,而只是將須要刪除的元素放到到最初,同時前往一個新的尾部迭代器,
好比,上述例子中,挪用完remove後,vector中的值普通為 //10 30 30 10 10 10 10 20
而假如願望真的刪除元素,須要加上成員函數erase()來完成刪除 【remove-erase習用法】:


myvector.erase(std::remove(myvector.begin(), myvector.end(), 20),myvector.end()); // 10 30 30 10 10

unique() 區間去重

從區間中刪除相鄰雷同的元素,異樣,這個算法也不會真實的刪除元素,而是將待刪除的元素移到區間尾部;
應用【unique-erase習用法】:


int myints[] = {10,20,20,20,30,30,20,20,10};           // 10 20 20 20 30 30 20 20 10
std::vector<int> myvector (myints,myints+9);
std::vector<int>::iterator it;
it = std::unique (myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?
myvector.erase(it,myvector.end());

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved