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

来源:互联网 发布:java 浏览器输入框 编辑:程序博客网 时间:2024/05/22 03:31

在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;}

结果为:

0 0