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.3 replace_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;
}
复制代码

 

posted @   大白不会敲代码  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示