1. 程式人生 > 其它 >C++提高程式設計 5 STL -常用演算法(拷貝替換演算法)

C++提高程式設計 5 STL -常用演算法(拷貝替換演算法)

5.4 常用拷貝和替換演算法

演算法簡介:

    copy        //容器內指定範圍的元素拷貝到另一個容器中

    replace       //將容器內指定範圍的舊元素修改為新元素

    replace_if      //容器內指定範圍滿足條件的元素替換為新元素

    swap        //互換兩個容器的元素

5.4.1 copy      //容器內指定範圍的元素拷貝到另一個容器中

函式原型:copy(iterator beg, iterator end,iterator dest);

//按值查詢元素,找到返回指定位置迭代器,找不到返回結束迭代器位置

#include<iostream>
using
namespace std; #include<vector> #include<algorithm> //常用拷貝和替換演算法 copy void print1(int val) { cout << val << " "; } void test1() { vector<int>v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } vector<int>v2; v2.resize(v1.size()); copy(v1.begin(), v1.end(), v2.begin()); for_each(v2.begin(), v2.end(), print1);
//0 1 2 3 4 5 6 7 8 9 cout << endl; } int main() { test1(); system("pause"); return 0; }

5.4.2 replace     //將容器內指定範圍的舊元素修改為新元素

函式原型:replace(iterator beg, iterator end,oldvalue,newvalue);

//beg(end):開始(結束)迭代器    oldvalue(newvalue):舊(新)元素

#include<iostream>
using namespace
std; #include<vector> #include<algorithm> //常用拷貝和替換演算法 replace   //普通函式     //void print1(int val) //{ // cout << val << " "; //} //仿函式 class print1 { public: void operator()(int val) { cout << val << " "; } }; void test1() { vector<int>v1; v1.push_back(20); v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); v1.push_back(20); v1.push_back(50); v1.push_back(20); cout << "替換前:"; for_each(v1.begin(), v1.end(), print1()); //替換前:20 10 20 30 40 50 20 50 20 cout << endl; cout << "替換後:"; replace(v1.begin(), v1.end(), 20, 2000); for_each(v1.begin(), v1.end(), print1()); //替換後:2000 10 2000 30 40 50 2000 50 2000 cout << endl; } int main() { test1(); system("pause"); return 0; }

5.4.3replace_if      //將區間內滿足條件的元素,替換為新元素

函式原型:replace_if(iterator beg, iterator end, _pred, newvalue);

//_pred 謂詞(返回bool型別)    newvalue替換的新元素

#include<iostream>
using namespace std;
#include<vector>   
#include<algorithm>

//常用拷貝和替換演算法  replace_if   

//普通函式     
//void print1(int val)
//{
//    cout << val << "  ";
//}

//仿函式
class print1
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }
};

class Greater
{
public:
    bool operator()(int val)
    {
        return val >= 30;
    }
};

void test1()
{
    vector<int>v1;
    v1.push_back(20);
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    v1.push_back(20);
    v1.push_back(50);
    v1.push_back(20);

    //將大於等於30的數  替換為3000
    cout << "替換前:";
    for_each(v1.begin(), v1.end(), print1());        //替換前:20 10 20 30 40 50 20 50 20
    cout << endl;

    cout << "替換後:";
    replace_if(v1.begin(), v1.end(), Greater(), 3000);
    for_each(v1.begin(), v1.end(), print1());        //替換後:20 10 20 3000 3000 3000 20 3000 20
    cout << endl;
}


int main()
{
    test1();

    system("pause");
    return 0;
}

5.4.4 swap      //互換兩個容器元素

函式原型:swap( container c1,container c2 );   //c1容器1,c2容器2 c1和c2應為同種型別容器

#include<iostream>
using namespace std;
#include<vector>   
#include<algorithm>

//常用拷貝和替換演算法  swap  

//普通函式     
void print1(int val)
{
    cout << val << " ";
}

//仿函式
//class print1
//{
//public:
//    void operator()(int val)
//    {
//        cout << val << " ";
//    }
//};

void test1()
{
    vector<int>v1;
    vector<int>v2;

    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    for (int j = 0; j < 5; j++)
    {
        v2.push_back(j);
    }

    cout << "交換前:" << endl;
    for_each(v1.begin(), v1.end(), print1);            //0 1 2 3 4 5 6 7 8 9
    cout << endl;
    for_each(v2.begin(), v2.end(), print1);            //0 1 2 3 4
    cout << endl;


    cout << "----------------------" << endl;
    cout << "交換後:" << endl;
    swap(v1, v2);
    for_each(v1.begin(), v1.end(), print1);            //0 1 2 3 4
    cout << endl;
    for_each(v2.begin(), v2.end(), print1);            //0 1 2 3 4 5 6 7 8 9
    cout << endl;


}


int main()
{
    test1();

    system("pause");
    return 0;
}