一、非变异算法
是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。非变异算法具有极为广泛的适用性,基本上可应用与各种容器。
1查找容器元素find
它用于查找等于某值的元素。它在迭代器区间[first,last)(闭开区间)上查找等于value值的元素,如果迭代器i所指的元素满足*i=value,则返回迭代器i;未找到满足条件的元素,返回last。函数原型:find( v1.begin(), v1.end(), num_to_find );
复制代码 代码如下:
#include
#include
#include
using namespace std;
void main()
{
int num_to_find = 6;
vector
for( int i = 0; i < 10; i++ )
v1.push_back(2*i);
vector
result = find( v1.begin(), v1.end(), num_to_find );
if( result == v1.end() )
cout << "未找到任何元素匹配 " << num_to_find << endl;
else
cout << "匹配元素的索引值是 " << result-v1.begin() << endl;
}
2条件查找容器元素find_if
利用返回布尔值的谓词判断pred,检查迭代器区间[first,last)(闭开区间)上的每一个元素,如果迭代器i满足pred(*i)=true,表示找到元素并返回迭代值i(找到的第一个符合条件的元素);未找到元素,返回末位置last。函数原型:find_if(v.begin(),v.end(),divby5);
复制代码 代码如下:
#include
#include
#include
using namespace std;
bool divby5(int x)
{
return x%5?0:1;
}
void main()
{
vector
for(int i=0;i { v[i]=(i+1)*(i+3); cout< } cout< vector ilocation=find_if(v.begin(),v.end(),divby5); if(ilocation!=v.end()) cout<<"找到第一个能被5整除的元素:"<<*ilocation< } list 4条件统计count_if count_if(l.begin(),l.end(),pred)。谓词pred含义同find_if中的谓词。例子可以参考例2. 5子序列搜索search search算法函数在一个序列中搜索与另一序列匹配的子序列。参数分别为一个序列的开始位置,结束位置和另一个序列的开始,结束位置。 函数原型:search(v1.begin(),v1.end(),v2.begin(),v2.end()); #include #include using namespace std; void main() { vector cout<<"v1:"; for(int i=0;i<5;i++) { v1.push_back(i+5); //注意:v1定义时没有给定大小,因此这里不能直接使用赋值语句。 cout< } cout< vector cout<<"v2:"; for(i=0;i<2;i++) { v2.push_back(i+7); cout< } cout< vector ilocation=search(v1.begin(),v1.end(),v2.begin(),v2.end()); if(ilocation!=v1.end()) cout<<"v2的元素包含在v1中,起始元素为"<<"v1["< else cout<<"v2的元素不包含在v1中"< } search_n算法函数搜索序列中是否有一系列元素值均为某个给定值的子序列。函数原型:search_n(v.begin(),v.end(),3,8),在v中找到3个连续的元素8 #include #include using namespace std; void main() { vector v.push_back(1); v.push_back(8); v.push_back(8); v.push_back(8); v.push_back(6); v.push_back(6); v.push_back(8); vector i=search_n(v.begin(),v.end(),3,8); if(i!=v.end()) cout<<"在v中找到3个连续的元素8"< else cout<<"在v中未找到3个连续的元素8"< } 函数原型find_end(v1.begin(),v1.end(),v2.begin(),v2.end());在V1中要求的位置查找V2中要求的序列。 #include #include using namespace std; void main() { vector v1.push_back(-5); v1.push_back(1); v1.push_back(2); v1.push_back(-6); v1.push_back(-8); v1.push_back(1); v1.push_back(2); v1.push_back(-11); vector v2.push_back(1); v2.push_back(2); vector i=find_end(v1.begin(),v1.end(),v2.begin(),v2.end()); if(i!=v1.end()) cout<<"v1中找到最后一个匹配v2的子序列,位置在" <<"v1["< } 是一组能够修改容器元素数据的模板函数。copy(v.begin(),v.end(),l.begin());将v中的元素复制到l中。 1 元素复制copy #include #include #include using namespace std; void main() { vector v.push_back(1); v.push_back(3); v.push_back(5); list l.push_back(2); l.push_back(4); l.push_back(6); l.push_back(8); l.push_back(10); copy(v.begin(),v.end(),l.begin()); list for(i=l.begin();i!=l.end();i++) cout<<*i<<' '; cout< } 函数原型:transform(v.begin(),v.end(),l.begin(),square);也是复制,但是要按某种方案复制。 #include #include #include using namespace std; int square(int x) { return x*x; } void main() { vector v.push_back(5); v.push_back(15); v.push_back(25); list transform(v.begin(),v.end(),l.begin(),square); list for(i=l.begin();i!=l.end();i++) cout<<*i<<' '; cout< } replace算法将指定元素值替换为新值。 #include #include using namespace std; void main() { vector v.push_back(13); v.push_back(25); v.push_back(27); v.push_back(25); v.push_back(29); replace(v.begin(),v.end(),25,100); vector for(i=v.begin();i!=v.end();i++) cout<<*i<<' '; cout< } 4 条件替换replace_if 函数原型:replace_if(v.begin(),v.end(),odd,100); #include #include using namespace std; bool odd(int x) { return x%2; } void main() { vector for(int i=1;i<10;i++) v.push_back(i); replace_if(v.begin(),v.end(),odd,100); vector for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< } 函数原型fill_n(v.begin(),5,-1);向从v.begin开始的后面5个位置跳入-1 #include #include using namespace std; void main() { vector fill_n(v.begin(),5,-1); vector for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< } 6 随机生成n个元素generate 函数原型:generate_n(v.begin(),5,rand);向从v.begin开始的后面5个位置随机填写数据。 #include #include using namespace std; void main() { vector generate_n(v.begin(),5,rand); vector for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< } 返回值相当于移除满足条件的元素后形成的新向量的end()值。 函数原型:remove_if(v.begin(),v.end(),even); #include #include using namespace std; bool even(int x) { return x%2?0:1; } void main() { vector for(int i=1;i<=10;i++) v.push_back(i); vector cout<<"移除前:"; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< result=remove_if(v.begin(),v.end(),even); cout<<"移除后:"; for(ilocation=v.begin();ilocation!=result;ilocation++) cout<<*ilocation<<' '; cout< } 函数原型:unique(v.begin(),v.end()); #include #include using namespace std; void main() { vector v.push_back(2); v.push_back(6); v.push_back(6); v.push_back(6); v.push_back(9); v.push_back(6); v.push_back(3); vector result=unique(v.begin(),v.end()); for(ilocation=v.begin();ilocation!=result;ilocation++) cout<<*ilocation<<' '; cout< } 三、排序算法 1、创建堆make_heap 2、元素入堆push_heap(默认插入最后一个元素) 3、元素出堆pop_heap(与push_heap一样,pop_heap必须对堆操作才有意义) #include #include using namespace std; void main() { vector v.push_back(5); v.push_back(6); v.push_back(4); v.push_back(8); v.push_back(2); v.push_back(3); v.push_back(7); v.push_back(1); v.push_back(9); make_heap(v.begin(),v.end()); v.push_back(20); push_heap(v.begin(),v.end()); vector for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< pop_heap(v.begin(),v.end()); for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< } 使用: sort_heap(v.begin(),v.end()); #include #include #include using namespace std; void main() { vector v.push_back(3); v.push_back(9); v.push_back(6); v.push_back(3); v.push_back(17); v.push_back(20); v.push_back(12); vector for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< make_heap(v.begin(),v.end()); sort_heap(v.begin(),v.end()); for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< } 3 9 6 3 17 20 12 5 排序sort 函数原型:sort(v.begin(),v.end()); #include #include using namespace std; void main() { vector v.push_back(2); v.push_back(8); v.push_back(-15); v.push_back(90); v.push_back(26); v.push_back(7); v.push_back(23); v.push_back(30); v.push_back(-27); v.push_back(39); v.push_back(55); vector for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< sort(v.begin(),v.end());//比较函数默认 for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout< }
3统计等于某值的容器元素个数count
count(l.begin(),l.end(),value)
复制代码 代码如下:
#include
6重复元素子序列搜索search_n
复制代码 代码如下:
#include
7最后一个子序列搜索find_end
复制代码 代码如下:
#include
二、变异算法
复制代码 代码如下:
#include
2 元素变换transform改变
复制代码 代码如下:
#include
3 替换replace
复制代码 代码如下:
#include
输出结果为13 100 27 100 29
复制代码 代码如下:
#include
5 n次填充fill_n
复制代码 代码如下:
#include
输出结果:-1 -1 -1 -1 -1 0 0 0 0 0
复制代码 代码如下:
#include
7 条件移除remove_if
复制代码 代码如下:
#include
8 剔除连续重复元素unique
复制代码 代码如下:
#include
输出结果:2 6 9 6 3
复制代码 代码如下:
#include
4 堆排序sort_heap
复制代码 代码如下:
make_heap(v.begin(),v.end());
输出结果:
3 3 6 9 12 17 20
复制代码 代码如下:
#include



