查找两个迭代器标记范围内的一个值,使用find函数所在头文件是algorithm
类似的,由于指针的行为与作用在内置数组上的迭代器一样,因此也可以使用find来搜索数组
int a[6] = {1,2,2,2,3,4};
int *result = find(ia,ia+6,1);
泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。算法基于迭代器及其操作实现,而并非基于容器操作。这个事实也许比较意外,但本质上暗示了:使用“普通”的迭代器时,算法从不修改基础容器的大小,算法也许会改变存储在容器中的元素的值,也许会在容器内移动元素,但是,算法从不直接添加或删除元素。
有一种特殊的迭代器类:insert,除了用于遍历其所绑定的序列之外,还可以实现更多的功能。在给这类迭代器赋值时,在基础容器上将执行插入操作。如果算法操作这类迭代器,迭代器将可能导致在容器中添加元素。但是,算法本身从不这样做。
numeric中的accumulate的返回类型根据最后一个参数决定
vector<int> a(10);//all is 0;
fill(a.begin(),a.begin()+2,1);//1,1,000000
fill(a.begin(),100,10);//不检查是否越界,容易产生灾难性错误
iterator中的back_iterator
vector<int>vec;
fill_n(back_iterator(vec),10,0);//在迭代器后面增加10个数字0.
vector<int>iver;
copy(list.begin(),list.end(),back_iterator(iver));//复制list的内容到iver中删除本来的内容
vector<int>iver(list.begin(),list.end());
replace(list.begin(),list.end(),0,42)//把list中的0替换成42;
replace_copy(list.begin(),list.end(),back_iterator(vector),0,42)//调用该函数后list没有改变vector存储list的一个副本,而list内的所有0在iver中变成了42;
对容器元素重新排序的算法
sort(word.begin(),word.end());//排序
vector<string>::iterator end_unique = unique(word.begin(),word.end());//相同的放到后面
word.erase(end_unique,word.end());//删除
////////////////
bool isShorter(const string&s1,const string&s2)
{
return s1.size()<s2.size();
}
bool GT6(const string&s)
{
return s.size()>=6;
}
stable_sort(word.begin(),word.end(),isShorter);//调用后word中的元素按长度大小排序,而长度相同的单词保持字典顺序
vector<string>::size_type wc= count_if(word.begin(),word.end(),GT6)//统计其中长度不小于6的数目
类似的,由于指针的行为与作用在内置数组上的迭代器一样,因此也可以使用find来搜索数组
int a[6] = {1,2,2,2,3,4};
int *result = find(ia,ia+6,1);
泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。算法基于迭代器及其操作实现,而并非基于容器操作。这个事实也许比较意外,但本质上暗示了:使用“普通”的迭代器时,算法从不修改基础容器的大小,算法也许会改变存储在容器中的元素的值,也许会在容器内移动元素,但是,算法从不直接添加或删除元素。
有一种特殊的迭代器类:insert,除了用于遍历其所绑定的序列之外,还可以实现更多的功能。在给这类迭代器赋值时,在基础容器上将执行插入操作。如果算法操作这类迭代器,迭代器将可能导致在容器中添加元素。但是,算法本身从不这样做。
numeric中的accumulate的返回类型根据最后一个参数决定
vector<int> a(10);//all is 0;
fill(a.begin(),a.begin()+2,1);//1,1,000000
fill(a.begin(),100,10);//不检查是否越界,容易产生灾难性错误
iterator中的back_iterator
vector<int>vec;
fill_n(back_iterator(vec),10,0);//在迭代器后面增加10个数字0.
vector<int>iver;
copy(list.begin(),list.end(),back_iterator(iver));//复制list的内容到iver中删除本来的内容
vector<int>iver(list.begin(),list.end());
replace(list.begin(),list.end(),0,42)//把list中的0替换成42;
replace_copy(list.begin(),list.end(),back_iterator(vector),0,42)//调用该函数后list没有改变vector存储list的一个副本,而list内的所有0在iver中变成了42;
对容器元素重新排序的算法
sort(word.begin(),word.end());//排序
vector<string>::iterator end_unique = unique(word.begin(),word.end());//相同的放到后面
word.erase(end_unique,word.end());//删除
////////////////
bool isShorter(const string&s1,const string&s2)
{
return s1.size()<s2.size();
}
bool GT6(const string&s)
{
return s.size()>=6;
}
stable_sort(word.begin(),word.end(),isShorter);//调用后word中的元素按长度大小排序,而长度相同的单词保持字典顺序
vector<string>::size_type wc= count_if(word.begin(),word.end(),GT6)//统计其中长度不小于6的数目