在stl中既有通用函数,又有相同成员函数主要表现在list中。
以remove为例
list coll; // insert elements from 6 to 1 and 1 to 6 for (int i=1; i<=6; ++i) { coll.push_front(i); coll.push_back(i); } // print all elements of the collection cout << "pre: "; copy (coll.cbegin(), coll.cend(), // source ostream_iterator (cout," ")); // destination cout << endl; // remove all elements with value 3 remove (coll.begin(), coll.end(), // range 3);开始是list中的元素为6 5 4 3 2 1 1 2 3 4 5 6
remove之后变成6 5 4 2 1 2 4 5 6 5 6
remove算法具有linear complexity是将容器中的等于value的值得元素使用后续的元素进行替换,这就需要进行deference。因此只是调整元素的位置,而不是真正的删除。
函数返回的是A forward iterator addressing the new end position of the modified range, one past the final element of the remnant sequence free of the specified value
然而在list中也提供了一个remove的成员函数,他是直接删除元素。它删除元素不需要移动元素,只需要进行相应的指针操作。因此具有更好的性能。
templatevoid list<_Tp, _Alloc>::remove(const _Tp& __value){ iterator __first = begin(); iterator __last = end(); while (__first != __last) { iterator __next = __first; ++__next; if (*__first == __value) erase(__first); __first = __next; }}
所以在选择通用算法和成员函数时,比较具有good performance(具有constant or linear complexity)。