C++抽象编程——STL实战(3)——数组元素的移除与合并

在STL中,对元素的插入跟移除也是对比数组的一大改进,这次我们就重点讨论一下怎么样在STL中移除跟合并元素。

这里的所有方法都要导入头文件 < algorithm >

实例一:移除指定与特定的值

出口的方法:

remove(first,last,value)
remove_if(first,last,value)

关于参数的解析与返回的类型值,参考我上一篇的博文C++抽象编程——STL实战(2)——查找与修改
现在上代码;

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool isOdd(int a);
int main(){
    vector<int> vec;
    vector<int>::iterator it,it2;
    for(int i = 0; i < 10; i++){
        int a;
        cin >> a;
        vec.push_back(a);
    }
    cout << "输入要移除的数 " ;
    int n;
    cin >> n;
    it = remove(vec.begin(), vec.end(),n); /*将移除n后的vector的迭代器的最后值
                                            复制给it*/ 
    for(it2 = vec.begin(); it2 != it; it2++){
        cout << *it2 << " ";
    }
    cout << endl;
    cout << "紧接着移除奇数" << endl; 
    it2 = it; /*这一步将我们上一步所得的vector传递下来*/ 
    it = remove_if(vec.begin(),it2,isOdd);
    for(it2 = vec.begin(); it2 != it; it2++){
        cout << *it2 << " ";
    }
    return 0;
}

bool isOdd(int a) {
    return (a % 2 == 1);
}

结果如下;

分析
这里的bool函数是可以为其他我们自定义的函数,因为迭代器会在里面每一个元素都会去遍历,并且用里面的元素作为函数的参数去判断是不是应该被移除。 14为偶数,判断为false,所以不执行romove,继续判断下一个元素5,为true,所以,执行remove。

实例二:移除数组内连续重复元素

出口的方法:

unique(first,last,pre)

其中的pre为bool类型的函数,可要可不要,下面会代码示例:

#include <iostream>    
#include <algorithm>    
#include <vector>       
using namespace std;
int main () {
    vector<int> vec;
    vector<int>::iterator it,it1;
    for(int i = 0; i <10; i++ ){ /*输入一个vector*/ 
        int a;
        cin >> a;
        vec.push_back(a);
    }
    it = unique (vec.begin(), vec.end());
    for(it1 = vec.begin(); it1 != it; it1++){
        cout << *it1 << " ";
    }

  return 0;
}

结果如下:
这里写图片描述

注意,这里移除指的是连续且重复的元素,这就是为什么两个4没有移除其中一个,因为他们是不连续的。那么我们该怎么办呢?很简单,把它们变为连续的不就好了,那么怎么变为连续的呢?我们就把数组sort一下不就完了嘛

实例三:合并数组

出口的方法:

merge(first1, last1,first2, last2,result);

参数解释:
1. first1, last1,first2, last2,分别为两个数组的合并范围。
2. result是用于储存这个数组的首个迭代器

我们看个代码:

#include <iostream>    
#include <algorithm>    
#include <vector>       
using namespace std;
int main () {
    vector<int> vec;
    vector<int> vec1;
    vector<int> vec2;
    vector<int>::iterator it;
    for(int i = 0; i <10; i++ ){ /*输入第一个vector*/ 
        vec.push_back(5 * i);
    }
    for(int n = 10; n >= 0; n--){/*输入第二个vector*/
        vec2.push_back(4 * n);
    }
    /*合并*/ 
    merge(vec.begin(),vec.end(),vec1.begin(),vec1.end(),vec2.begin());
    cout << "合并后的值为" << endl; 
    for(it = vec2.begin(); it != vec2.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
    cout << "排序后的值为" << endl;
    sort(vec2.begin(),vec2.end());
    for(it = vec2.begin(); it != vec2.end(); it++){
        cout << *it << " ";
    }

  return 0;
}

结果为:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值