在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;
}
结果为: