C++_STL—較為常用的演算法

廣海_小瘋瘋丶發表於2018-01-11

C++_STL—較為常用的演算法

一、非變異演算法

是一組不破壞運算元據的模板函式,用來對序列資料進行逐個處理、元素查詢、子序列搜尋、統計和匹配。非變異演算法具有極為廣泛的適用性,基本上可應用與各種容器。

1.查詢容器元素找到

它用於查詢等於某值的元素。它在迭代器區間[first,last)(閉開區間)上查詢等於value值的元素,如果迭代器i所指的元素滿足*i=value,則返回迭代器i;未找到滿足條件的元素,返回last。函式原型:find( v1.begin(), v1.end(), num_to_find );

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    int num_to_find = 6;
    vector<int> v1;
    for( int i = 0; i < 10; i++ )
        v1.push_back(2*i);
    vector<int>::iterator result;
    result = find( v1.begin(), v1.end(), num_to_find );
    if( result == v1.end() )
        cout << "未找到任何元素匹配 " << num_to_find << endl;
    else
        cout << "匹配元素的索引值是 " << result-v1.begin() << endl;
}

2.條件查詢容器元素find_if

利用返回布林值的謂詞判斷pred,檢查迭代器區間[first,last)(閉開區間)上的每一個元素,如果迭代器i滿足pred(*i)=true,表示找到元素並返回迭代值i(找到的第一個符合條件的元素);未找到元素,返回末位置last。函式原型:find_if(v.begin(),v.end(),divby5);

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool divby5(int x)
{
    return x%5?0:1;
}

void main()
{
    vector<int> v(20);
    for(int i=0;i<v.size();i++)
    {
        v[i]=(i+1)*(i+3);
        cout<<v[i]<<' ';
    }
    cout<<endl;
    vector<int>::iterator ilocation;
    ilocation=find_if(v.begin(),v.end(),divby5);
    if(ilocation!=v.end())
        cout<<"找到第一個能被5整除的元素:"<<*ilocation<<endl<<"元素的索引位置是: "<<ilocation-v.begin()<<endl;
}

3.統計等於某值的容器元素個數count

list<int> l;
count(l.begin(),l.end(),value)

4.條件統計count_if

count_if(l.begin(),l.end(),pred)。謂詞pred含義同find_if中的謂詞。例子可以參考例2.

5.子序列搜尋search

search演算法函式在一個序列中搜尋與另一序列匹配的子序列。引數分別為一個序列的開始位置,結束位置和另一個序列的開始,結束位置。
函式原型:search(v1.begin(),v1.end(),v2.begin(),v2.end());

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v1;
    cout<<"v1:";
    for(int i=0;i<5;i++)
    {
        v1.push_back(i+5);
        //注意:v1定義時沒有給定大小,因此這裡不能直接使用賦值語句。
        cout<<v1[i]<<' ';
    }
    cout<<endl; 
    vector<int> v2; 
    cout<<"v2:";    
    for(i=0;i<2;i++)    
    {   
        v2.push_back(i+7);
        cout<<v2[i]<<' ';
    }
    cout<<endl;
    vector<int>::iterator ilocation;
    ilocation=search(v1.begin(),v1.end(),v2.begin(),v2.end());
    if(ilocation!=v1.end())
        cout<<"v2的元素包含在v1中,起始元素為"<<"v1["<<ilocation-v1.begin()<<']'<<endl;
    else
        cout<<"v2的元素不包含在v1中"<<endl;

}

6.重複元素子序列搜尋search_n

search_n演算法函式搜尋序列中是否有一系列元素值均為某個給定值的子序列。函式原型:search_n(v.begin(),v.end(),3,8),在v中找到3個連續的元素8

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(8);
    v.push_back(8);
    v.push_back(8);
    v.push_back(6);
    v.push_back(6);
    v.push_back(8);
    vector<int>::iterator i;
    i=search_n(v.begin(),v.end(),3,8);
    if(i!=v.end())
        cout<<"在v中找到3個連續的元素8"<<endl;
    else
        cout<<"在v中未找到3個連續的元素8"<<endl;
}

7.最後一個子序列搜尋find_end

函式原型find_end(v1.begin(),v1.end(),v2.begin(),v2.end());在V1中要求的位置查詢V2中要求的序列。

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v1;
    v1.push_back(-5);
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(-6);
    v1.push_back(-8);
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(-11);
    vector<int> v2;
    v2.push_back(1);
    v2.push_back(2);
    vector<int>::iterator i;
    i=find_end(v1.begin(),v1.end(),v2.begin(),v2.end());
    if(i!=v1.end())
        cout<<"v1中找到最後一個匹配v2的子序列,位置在" <<"v1["<<i-v1.begin()<<"]"<<endl;
}

二、變異演算法

是一組能夠修改容器元素資料的模板函式。copy(v.begin(),v.end(),l.begin());將v中的元素複製到l中。

1. 元素複製copy

#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    list<int> l;
    l.push_back(2);
    l.push_back(4);
    l.push_back(6);
    l.push_back(8);
    l.push_back(10);
    copy(v.begin(),v.end(),l.begin());
    list<int>::iterator i;
    for(i=l.begin();i!=l.end();i++)
        cout<<*i<<' ';
    cout<<endl;
}

2. 元素變換transform改變

函式原型:transform(v.begin(),v.end(),l.begin(),square);也是複製,但是要按某種方案複製。

#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
using namespace std;
int square(int x)
{
    return x*x;
}
void main()
{
    vector<int> v;
    v.push_back(5);
    v.push_back(15);
    v.push_back(25);
    list<int> l(3);
    transform(v.begin(),v.end(),l.begin(),square);
    list<int>::iterator i;
    for(i=l.begin();i!=l.end();i++)
        cout<<*i<<' ';
    cout<<endl;
}

3. 替換replace

replace演算法將指定元素值替換為新值。

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(13);
    v.push_back(25);
    v.push_back(27);
    v.push_back(25);
    v.push_back(29);
    replace(v.begin(),v.end(),25,100);
    vector<int>::iterator i;
    for(i=v.begin();i!=v.end();i++)
        cout<<*i<<' ';
    cout<<endl;
}

輸出結果為13 100 27 100 29

4. 條件替換replace_if

函式原型:replace_if(v.begin(),v.end(),odd,100);

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool odd(int x)
{
    return x%2;
}
void main()
{
    vector<int> v;
    for(int i=1;i<10;i++)
    v.push_back(i);
    replace_if(v.begin(),v.end(),odd,100);
    vector<int>::iterator ilocation;
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

5. n次填充fill_n

函式原型fill_n(v.begin(),5,-1);向從v.begin開始的後面5個位置跳入-1

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v(10);
    fill_n(v.begin(),5,-1);
    vector<int>::iterator ilocation;
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

輸出結果:-1 -1 -1 -1 -1 0 0 0 0 0

6. 隨機生成n個元素generate

函式原型:generate_n(v.begin(),5,rand);向從v.begin開始的後面5個位置隨機填寫資料。

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v(10);
    generate_n(v.begin(),5,rand);
    vector<int>::iterator ilocation;
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

7. 條件移除remove_if

返回值相當於移除滿足條件的元素後形成的新向量的end()值。
函式原型:remove_if(v.begin(),v.end(),even);

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool even(int x)
{
    return x%2?0:1;
}
void main()
{
    vector<int> v;
    for(int i=1;i<=10;i++)
        v.push_back(i);
    vector<int>::iterator ilocation,result;
    cout<<"移除前:";
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
    result=remove_if(v.begin(),v.end(),even);
    cout<<"移除後:";
    for(ilocation=v.begin();ilocation!=result;ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

8. 剔除連續重複元素unique

函式原型:unique(v.begin(),v.end());

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(2);
    v.push_back(6);
    v.push_back(6);
    v.push_back(6);
    v.push_back(9);
    v.push_back(6);
    v.push_back(3);
    vector<int>::iterator ilocation,result;
    result=unique(v.begin(),v.end());
    for(ilocation=v.begin();ilocation!=result;ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

輸出結果:2 6 9 6 3

三、排序演算法

1. 建立堆make_heap

2. 元素入堆push_heap(預設插入最後一個元素)

3. 元素出堆pop_heap(與push_heap一樣,pop_heap必須對堆操作才有意義)

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(5);
    v.push_back(6);
    v.push_back(4);
    v.push_back(8);
    v.push_back(2);
    v.push_back(3);
    v.push_back(7);
    v.push_back(1);
    v.push_back(9);
    make_heap(v.begin(),v.end());
    v.push_back(20);
    push_heap(v.begin(),v.end());
    vector<int>::iterator ilocation;
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
    pop_heap(v.begin(),v.end());
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

4. 堆排序sort_heap

使用:
make_heap(v.begin(),v.end());
sort_heap(v.begin(),v.end());

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(3);
    v.push_back(9);
    v.push_back(6);
    v.push_back(3);
    v.push_back(17);
    v.push_back(20);
    v.push_back(12);
    vector<int>::iterator ilocation;
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
    make_heap(v.begin(),v.end());
    sort_heap(v.begin(),v.end());
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

輸出結果:
3 9 6 3 17 20 12
3 3 6 9 12 17 20

5. 排序sort

函式原型:sort(v.begin(),v.end());

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void main()
{
    vector<int> v;
    v.push_back(2);
    v.push_back(8);
    v.push_back(-15);
    v.push_back(90);
    v.push_back(26);
    v.push_back(7);
    v.push_back(23);
    v.push_back(30);
    v.push_back(-27);
    v.push_back(39);
    v.push_back(55);
    vector<int>::iterator ilocation;
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
    sort(v.begin(),v.end());//比較函式預設
    for(ilocation=v.begin();ilocation!=v.end();ilocation++)
        cout<<*ilocation<<' ';
    cout<<endl;
}

該文章轉自http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/27/2520532.html

相關文章