accumulate用于容器元素的“累运算”,累加,累乘,等等,默认累加。
accumulate (coll.begin(), coll.end()) ;
accumulate (coll.begin(), coll.end(), // range
1, // initial value
multiplies<int>()) // operation
adjacent_difference创建一个新序列,用于相邻元素的运算,默认为差值。
adjacent_difference (coll.begin(), coll.end(), // source
ostream_iterator<int>(cout," ")); // dest.
adjacent_difference (coll.begin(), coll.end(), // source
iresult.begin(), // dest.
plus<int>()); // operation
adjacent_find 用于容器元素相邻元素的查找,默认为相等。
pos = adjacent_find (coll.begin(), coll.end());
bool doubled (int elem1, int elem2)
{
return elem1 * 2 == elem2;
}
pos = adjacent_find (coll.begin(), coll.end(), // range
doubled); // criterion
一些常用的运算函数对象
plus<int>() 加
multiplies<int>() 乘
times<int>() 乘
greater<int>() 大于
modulus<int>() 取模
less<int>() 小于
negate<int>() 符号取反
binary_search查找某个元素是否存在,返回布尔值。
binary_search(coll.begin(), coll.end(), 5)
copy( InputIterator first1, InputIterator last, OutputIterator first2 );
copy()把由[first,last)标记的序列中的元素 拷贝到由 first2 标记为开始的地方
copy (coll1.begin(), coll1.end(), // source range
back_inserter(coll2)); // destination range,这种方式一般是coll2只是被声明,还没有元素。
copy (coll2.begin(), coll2.end(), // source range
ostream_iterator<int>(cout," ")); // destination range
copy (coll1.rbegin(), coll1.rend(), // source range
coll2.begin()); // destination range,这种方式必须保证coll2已经分配了足够的空间。
copy (istream_iterator<string>(cin), // beginning of source
istream_iterator<string>(), // end of source 缺省构造函数,表示结尾。
ostream_iterator<string>(cout,"\n")); // destination 从cin读入,按行输出到cout
count查找数量,count_if满足某个条件函数的元素数量
num = count (coll.begin(), coll.end(), // range
4);
bool isEven (int elem)
{
return elem % 2 == 0;
}
num = count_if (coll.begin(), coll.end(), // range
isEven);
fill()将 value 的拷贝赋给[first,last)范围内的所有元素
f i l l _ n ( )把 value 的拷贝赋给[first,first+count)范围内的 count 个元素
// insert "hello" nine times
fill_n(back_inserter(coll), // beginning of destination
9, // count
"hello"); // new value
// overwrite all elements with "again"
fill(coll.begin(), coll.end(), // destination
"again"); // new value
find()、find_if()
// find first element with value 4
list<int>::iterator pos1;
pos1 = find (coll.begin(), coll.end(), // range
4); // value
// find first element greater than 3
pos = find_if (coll.begin(), coll.end(), // range
bind2nd(greater<int>(),3)); // criterion
find_end()
在由[first,last)标记的序列中查找 由 iterator 对[first2,last2)标记的第二个序列的最后一次出现.
// search last occurrence of subcoll in coll
deque<int>::iterator pos;
pos = find_end (coll.begin(), coll.end(), // range
subcoll.begin(), subcoll.end()); // subrange
find_first_of()
由[first2,last2)标记的序列包含了一组元素的集合 find_first_of()将在由[first1,last1)标记的序列中搜索这些元素。注意与find_end不同的一点是这里是搜元素,而find_end是搜整个匹配。
INSERT_ELEMENTS(coll,1,11);
INSERT_ELEMENTS(searchcoll,3,5);
// search first occurrence of an element of searchcoll in coll
vector<int>::iterator pos;
pos = find_first_of (coll.begin(), coll.end(), // range
searchcoll.begin(), // beginning of search set
searchcoll.end()); // end of search set
// search last occurrence of an element of searchcoll in coll
vector<int>::reverse_iterator rpos; // 用了反向iterator
rpos = find_first_of (coll.rbegin(), coll.rend(), // range
searchcoll.begin(), // beginning of search set
searchcoll.end()); // end of search set
for_each()依次对[first,last)范围内的所有元素应用函数 func func 不能对元素执行写操作
void print (int elem)
{
cout << elem << ' ';
}
// call print() for each element
for_each (coll.begin(), coll.end(), // range
print); // operation 函数指针
#include "algostuff.hpp"
using namespace std;
// function object that adds the value with which it is initialized
template <class T>
class AddValue {
private:
T theValue; // value to add
public:
// constructor initializes the value to add
AddValue (const T& v) : theValue(v) {
}
// the function call for the element adds the value
void operator() (T& elem) const {
elem += theValue;
}
};
函数对象必须实现()操作符。
int main()
{
vector<int> coll;
INSERT_ELEMENTS(coll,1,9);
// add ten to each element
for_each (coll.begin(), coll.end(), // range
AddValue<int>(10)); // operation 函数对象实例
PRINT_ELEMENTS(coll);
// add value of first element to each element
for_each (coll.begin(), coll.end(), // range
AddValue<int>(*coll.begin())); // operation
PRINT_ELEMENTS(coll);
}
generate( ForwardIterator first,
ForwardIterator last, Generator gen );
g e n e r a t e ( )通过对 gen的连续调用 来填充一个序列的[first,last)范围 gen可以是函数对象或函数指针
generate_n( OutputIterator first, Size n, Generator gen );
generate_n()通过对 gen的 n 次连续调用 来填充一个序列中从 first 开始的n个元素 gen可以是函数对象或函数指针
list<int> coll;
// insert five random numbers
generate_n (back_inserter(coll), // beginning of destination range
5, // count
rand); // new value generator
PRINT_ELEMENTS(coll);
// overwrite with five new random numbers
generate (coll.begin(), coll.end(), // destination range
rand); // new value generator
includes( )判断[first1,last1)的每一个元素是否被包含在序列[first2,last2)中
void
iter_swap ( ForwardIterator1 a, ForwardIterator2 b );
i t e r _ s w a p ( )交换由两个 ForwardIterator a 和 b 所指向的元素中的值
template< class Type >
void
swap ( Type &ob1, Type &ob2 );
s w a p ( )交换存贮在对象 ob1 和 ob2 中的值
swap( vec[iy], vec[ix] );
swap_range()将[first,last)标记的元素值与 从 first2 开始 相同个数 的元素值进行交换,这两个序列可以是同一容器中不相连的序列,也可以位于两个独立的容器中。
pos = swap_ranges (coll1.begin(), coll1.end(), // first range
coll2.begin()); // second range
m a x ( )返回 aval 和 bval 两个元素中较大的一个。
max_element()返回一个iterator 指向[first,last)序列中值为最大的元素
m i n ( )返回 aval 和 bval 两个元素中较小的一个。
min_element()返回一个 iterator 指向[first,last)序列中值为最小的元素
r e m o v e ( )删除在[first,last)范围内的所有value 实例, remove()以及 remove_if()并不真正地 把匹配到的元素从容器中清除 (即容器的大小保留不变), 而是每个不匹配的元素依次被赋值给从 first 开始的下一个空闲位置上,返问的ForwardIterator 标记了新的元素范围的下一个位置。例如,考虑序列{0,1,0,2,0,3,0,4} 假设我们希望删除所有的 0 ,则结果序列是 {1,2,3,4,0,3,0,4}。 1 被拷贝到第一个位置上, 2 被拷贝到第二个位置上, 3被拷贝到第三个位置上,4 被拷贝到第四个位置上,返回的ForwardIterator 指向第五个位置上的 0。典型的做法是该 iterator 接着被传递给 erase() ,以便删除无效的元素 内置数组不适合于使用 remove() 和 remove_if()算法,因为它们不能很容易地被改变大小,由于这个原因 对于数组而言 remove_copy()和 remove_copy_if()是更受欢迎的算法。
// remove all elements with value 5
pos = remove(coll.begin(), coll.end(), // range
5); // value to remove
// erase the ``removed'' elements in the container
coll.erase(pos, coll.end());
// remove all elements less than 4
coll.erase(remove_if(coll.begin(), coll.end(), // range
bind2nd(less<int>(),4)), // remove criterion
coll.end());
remove_copy()把所有不匹配的元素都拷贝到由 result 指定的容器中,返回的OutputIterator 指向被拷贝的末元素的下一个位置,但原始容器没有被改变。
// print elements without those having the value 3
remove_copy(coll1.begin(), coll1.end(), // source
ostream_iterator<int>(cout," "), // destination
3); // removed value
replace()将[first,last)范围内的所有 old_value 实例都用 new_value 替代
replace_copy()的行为与 replace()类似 只不过是把新序列拷贝到由result 开始的容器内
replace_if()、replace_copy_if()
// replace all elements with value 6 with 42
replace (coll.begin(), coll.end(), // range
6, // old value
42); // new value
// replace all elements with value less than 5 with 0
replace_if (coll.begin(), coll.end(), // range
bind2nd(less<int>(),5), // criterion for replacement
0); // new value
// print all elements with value 5 replaced with 55
replace_copy(coll.begin(), coll.end(), // source
ostream_iterator<int>(cout," "), // destination
5, // old value
55); // new value
r e v e r s e ( )对于容器中[first,last)范围内的元素重新按反序排列 例如 已知序列{0,1,1,2,3} ,则反序序列是{3,2,1,1,0}
reverse_copy()
// reverse order of elements
reverse (coll.begin(), coll.end());
// print all of them in reverse order
reverse_copy (coll.begin(), coll.end(), // source
ostream_iterator<int>(cout," ")); // destination
r o t a t e ( )把[first,middle)范围内的元素移到容器末尾,由 middle 指向的元素成为容器的第一个元素。例如,已知单词 hissboo 则以元素 b 为轴的旋转将单词变成 boohiss
rotate_copy()
rotate (coll.begin(), // beginning of range
coll.begin() + 1, // new first element
coll.end()); // end of range
// rotate so that element with value 4 is the beginning
rotate (coll.begin(), // beginning of range
find(coll.begin(),coll.end(),4), // new first element
coll.end()); // end of range
search()
给出了两个范围 ,search()返回一个iterator 指向在[first1,last1)范围内第一次出现子序列[first2,last2]的位置。 如果子序列未出现,则返回 last1。例如,在 mississippi 中 子序列iss 出现两次,则 search()返回一个iterator 指向第一个实例的起始处。缺省情况下 使用等于操作符进行元素的比较,第二个版本允许用户提供一个比较操作。
pos = search (coll.begin(), coll.end(), // range
subcoll.begin(), subcoll.end()); // subrange
// loop while subcoll found as subrange of coll
while (pos != coll.end())
search_n()在[first,last)序列中查找 value 出现 count 次 的子序列
set_difference()构造一个排过序的序列,其中的元素出现在第一个序列中,由[first,last)标记,但是不包含在第二个序列中,由[first2,last2]标记。例如,已失两个序列{0,1,2,3} 和{0,2,4,6} 则差集为{1,3}
set_intersection()构造一个排过序的序列,其中的元素在[first1,last1)和[first2,last2)序列中都存在。例如,已知序列{0,1,2,3}和{0,2,4,6} 则交集为{0,2}。
set_union()构造一个排过序的序列,它包含了[first1,last1)和[first2,last2)这两个范围内的所有元素。例如,已知两个序列{0,1,2,3}和{0,2,4,6},则并集为{0,1,2,3,4,6}。
s o r t ( )利用底层元素的小于操作符 以升序重新排列[first,last)范围内的元素。
// sort elements
sort (coll.begin(), coll.end());
// sorted reverse
sort (coll.begin(), coll.end(), // range
greater<int>()); // sorting criterion
bool lessLength (const string& s1, const string& s2)
{
return s1.length() < s2.length();
}
// sort (according to the length of the strings)
sort (coll1.begin(), coll1.end(), // range
lessLength); // criterion
stable_sort()利用底层类型的小于操作符 以升序重新排列[first,last)范围内的元素 并且
保留相等元素之间的顺序关系
t r a n s f o r m ( )的第一个版本将 op 作用在[first,last)范围内的每个元素上,从而产生一个新的序列。例如,已知序列{0,1,1,2,3,5}和函数对象 Double 它使每个元素加倍 那么 结果序列是{0,2,2,4,6,10}
// negate all elements in coll1
transform (coll1.begin(), coll1.end(), // source range
coll1.begin(), // destination range
negate<int>()); // operation
// transform elements of coll1 into coll2 with ten times their value
transform (coll1.begin(), coll1.end(), // source range
back_inserter(coll2), // destination range
bind2nd(multiplies<int>(),10)); // operation
第二个版本将bop 作用在一对元素上,其中一个元素来自序列[first1,last), 另一个来自由first2 开始的序列 最终产生一个新的序列。如果第二个序列包含的元素少于第一个序列,则运行时刻行为是未定义的。例如,已知序列{1,3,5,9}和{2,4,6,8} 以及函数对象 AddAndDouble,它把两个元素相加并将和加倍,则结果序列是{6,14,22,34}
// square each element
transform (coll1.begin(), coll1.end(), // first source range
coll1.begin(), // second source range
coll1.begin(), // destination range
multiplies<int>()); // operation
unique()对于连续的元素, 如果它们包含相同的值(使用底层类型的等于操作符来判断)或者把它们传给pred的计算结果都为 true,则这些元素被折叠成一个元素。实际上 unique()的行为有些不太直观,类似于 remove()算法。典型的做法是 这个 iterator 被传递给 erase() 以便删除无效的元素,由于内置数组不支持erase()操作,所以unique()不太适合于数组,unique_copy()对数组更为合适一些。
其实就是运用泛型算法时,算法不会去改变原容器的大小,所以remove和unique算法才会有此现象。
pos = unique (coll.begin(), coll.end());
// print elements
copy (coll.begin(), pos, // source
ostream_iterator<int>(cout," ")); // destination