STL算法(拷贝/替换)简介copyreplacereplace_ifswap

简介

copy replace replace_if swap

copy

集合拷贝

  • 需要保证目的集合的空间足够
template<class _InIt,
    class _OutIt> inline
    _OutIt copy(_InIt _First, _InIt _Last,
        _OutIt _Dest)
    {   // copy [_First, _Last) to [_Dest, ...)
    _DEPRECATE_UNCHECKED(copy, _Dest);
    return (_Copy_no_deprecate(_First, _Last, _Dest));
    }

 #if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt,
    class _OutTy,
    size_t _OutSize> inline
    _OutTy *copy(_InIt _First, _InIt _Last,
        _OutTy (&_Dest)[_OutSize])
    {   // copy [_First, _Last) to [_Dest, ...)
    return (_Unchecked(
        _Copy_no_deprecate(_First, _Last,
            _Array_iterator<_OutTy, _OutSize>(_Dest))));
    }
 #endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */

replace

查找替换。

template<class _FwdIt,
    class _Ty> inline
    void replace(_FwdIt _First, _FwdIt _Last,
        const _Ty& _Oldval, const _Ty& _Newval)
    {   // replace each matching _Oldval with _Newval
    _DEBUG_RANGE(_First, _Last);
    _Replace_unchecked(_Unchecked(_First), _Unchecked(_Last),
        _Oldval, _Newval);
    }

replace_if

将指定范围内所有操作结果为true的元素用新值替换。

template<class _FwdIt,
    class _Pr,
    class _Ty> inline
    void replace_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred, const _Ty& _Val)
    {   // replace each satisfying _Pred with _Val
    _DEBUG_RANGE_PTR(_First, _Last, _Pred);
    _Replace_if_unchecked(_Unchecked(_First), _Unchecked(_Last),
        _Pred, _Val);
    }

swap

集合元素交换

  • 集合的大小也会根据实际情况发生自动改变。
template<class _Ty,
    class _Alloc> inline
    void swap(vector<_Ty, _Alloc>& _Left, vector<_Ty, _Alloc>& _Right)
        _NOEXCEPT_OP(_NOEXCEPT_OP(_Left.swap(_Right)))
    {   // swap _Left and _Right vectors
    _Left.swap(_Right);
    }

示例

#include "stdafx.h"
#include "stdafx.h"
#include "iostream"
#include "string"
#include "algorithm"
#include "vector"
#include "list"
#include <functional>
using namespace std;
class Student {
private:
    int number;
    string name;
public:
    Student() {

    }
    Student(int number, string name) {
        cout << "构造 " << number << " " << name.c_str() << endl;
        this->number = number;
        this->name = name;
    }
    Student(const Student & stu) {
        //cout << "copy构造" <<stu.getNumber()<<" "<<stu.getName().c_str()<< endl;
        this->number = stu.getNumber();
        this->name = stu.getName();
    }
    ~Student() {
        //cout<<"析构 " << this->number << " " << this->name.c_str() << endl;
    }

    Student& operator=(const Student& stu) {
        this->number = stu.getNumber();
        this->name = stu.getName();
        return *this;
    }

    void print()const {
        cout << "print 》》 " << this->number << " " << this->name.c_str() << endl;
    }

    int getNumber() const {
        return this->number;
    }
    string getName()const {
        return this->name;
    }
};

void printStuV(vector<Student> v) {
    cout << "开始遍历vector<Student>============" << endl;
    for (vector<Student>::iterator it = v.begin(); it != v.end(); it++) {
        it->print();
    }
    cout << "结束遍历vector<Student>============" << endl;
}
void printNum(vector<int>v) {
    cout << "开始遍历vector<int>============" << endl;
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    cout << "结束遍历vector<int>============" << endl;
}

struct ReplaceFunc
{
    bool operator()(const Student & stu1) const {
        cout << "ReplaceFunc》》" << endl;
        return stu1.getNumber() >3;
    }
};

int main()
{

    vector<int> vNum;
    vNum.push_back(1);
    vNum.push_back(3);
    vNum.push_back(5);
    vector<int> vNum2;
    vNum2.push_back(10);
    vNum2.push_back(11);
    vNum2.push_back(12);
    vNum2.push_back(13);

    copy(vNum.begin(), vNum.end(), vNum2.begin());
    printNum(vNum2);
    replace(vNum2.begin(), vNum2.end(), 3, 20);
    printNum(vNum2);


    vector<Student> v;
    vector<Student> v2;
    v.push_back(Student(1, "one"));
    Student stu2(2, "two");
    v.push_back(stu2);
    v.push_back(Student(4, "four"));
    v.push_back(Student(3, "three"));
    v.push_back(Student(5, "five"));
    v2.resize(v.size());
    v2.push_back(Student(6, "six"));
    //拷贝需要先保证容器的大小足够。
    copy(v.begin(), v.end(), v2.begin());
    printStuV(v2);
    //按仿函数条件进行替换
    replace_if(v2.begin(), v2.end(), ReplaceFunc(), Student(10, "replace to ten"));
    printStuV(v2);
    //集合交换,容器的大小也会变化
    swap(v, v2);
    cout << endl;
    printStuV(v2);
    printStuV(v);
    return 0;
}

结果:

replace.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我就是马云飞

从 Java 到 Kotlin,再从 Kotlin 回归 Java

1561
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)第五章 Kotlin 面向对象编程(OOP)1. 面向对象的HelloWorld 2. 面向对象编程思想简述3.Kotlin 面向

Kotlin 同Java、 Scala、Groovy 一样,都使用关键字class 来定义类。

1433
来自专栏CSDN技术头条

为什么我坚持使用 JavaScript 函数声明

时光溯回到上世纪 90 年代晚期,在初次接触 JavaScript 时,老师教我们使用函数声明写下Hello World,它看上去是这样的······ fun...

2138
来自专栏小樱的经验随笔

HDU 2566 统计硬币

统计硬币 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java...

3589
来自专栏小樱的经验随笔

BZOJ 3670: [Noi2014]动物园【KMP变形 】

3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2738  Solve...

3537
来自专栏Python入门

十五道Python小案例,学会这些,Python基础已过关!

分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。

5154
来自专栏微信公众号:Java团长

Java HashMap 源码解析

继上一篇文章Java集合框架综述后,今天正式开始分析具体集合类的代码,首先以既熟悉又陌生的HashMap开始。

1132
来自专栏一名叫大蕉的程序员

大数据计数原理1+0=1这你都不会算(一)No.47

hello哈,大家是不是好久没见到我啦?我也是一直在摸索小伙伴们喜欢看到什么东西,不喜欢看什么东西,还请大家多多支持。为了表示感谢。小蕉在这给你们一鞠躬,二鞠躬...

2345
来自专栏码匠的流水账

聊聊flink的PrintSinkFunction

flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/data...

3263
来自专栏ml

hdu 1561 The more, The Better (树上背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 327...

3258

扫码关注云+社区

领取腾讯云代金券