STL总结

目录

一.STL的本质

二.STL的六大组件

容器

算法 

迭代器

适配器

仿函数


一.STL的本质

STL是标准模板库,是高效的C++程序库,增加了代码的复用率,使开发更高效。

二.STL的六大组件

容器

STL的容器,可以分为序列式容器和关联式容器。

STL总结

算法 

算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。STL中通用算法总共有70多个,主要包含:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。

accumulate:对区间中的元素进行累加

// 对[first, last)区间中元素在init的基础上进行累加
template <class InputIterator, class T>
T accumulate ( InputIterator first, InputIterator last, T init );

// 对[fist, last)区间中元素在init的基础上按照binary_op指定的操作进行累加
template <class InputIterator, class T, class BinaryOperation>
T accumulate ( InputIterator first, InputIterator last, T init,
BinaryOperation binary_op );
#include <numeric>
#include <vector>
struct Mul2
{
int operator()(int x, int y) { return x + 2 * y; }
};
int main()
{
// 对区间中的元素进行累加
vector<int> v{ 10, 20, 30 };
cout << accumulate(v.begin(), v.end(), 0)<<endl;
// 对区间中的每个元素乘2,然后累加
cout << accumulate(v.begin(), v.end(), 0, Mul2()) << endl;
return 0;
}

count与count_if:该算法的作用是统计区间中某个元素出现的次数

// 统计value在区间[first,last)中出现的次数
template <class InputIterator, class T>
ptrdiff_t count ( InputIterator first, InputIterator last, const T& value )
{
ptrdiff_t ret=0;
while (first != last) if (*first++ == value) ++ret;
return ret;
}

// 统计满足pred条件的元素在[first, last)中的个数
template <class InputIterator, class Predicate>
ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred )
{
ptrdiff_t ret=0;
while (first != last) if (pred(*first++)) ++ret;
return ret;
}

find,find_if:该算法的作用是找元素在区间中第一次出现的位置

// 在[first, last)中查找value第一次出现的位置,找到返回该元素的位置,否则返回last
// 时间复杂度O(N)
template<class InputIterator, class T>
InputIterator find ( InputIterator first, InputIterator last, const T& value )
{
for ( ;first!=last; first++) if ( *first==value ) break;
return first;
}

// 在[first, last)中查找满足pred条件的元素第一次出现的位置,找到返回该位置,否则返回last
// 时间复杂度O(N)
template<class InputIterator, class Predicate>
InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )
{
for ( ; first!=last ; first++ ) if ( pred(*first) ) break;
return first;
}

max和min:max返回两个元素中较大值,min返回两个元素中较小值。

template <class T>
const T& max(const T& a, const T& b)
{
return (a<b)?b:a;
}
template <class T>
const T& min(const T& a, const T& b)
{
return !(b<a)?a:b;
}

merge:该算法作用将两个有序序列合并成一个有序序列, 使用时必须包含头文件。

int main()
{
vector<int> v{ 2, 6, 5, 8 };
list<int> L{ 9, 3, 0, 5, 7 };
sort(v.begin(), v.end());
L.sort();
vector<int> vRet(v.size() + L.size());
merge(v.begin(), v.end(), L.begin(), L.end(), vRet.begin());
for (auto e : vRet)
cout << e << " ";
cout << endl;
return 0;
}

⑥ partial_sort:该算法的作用是:找TOPK

// 在区间[first, last)中找前middle-first个最小的元素,并存储在[first, middle)中
template <class RandomAccessIterator>
void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last);

// 在[first, last)中找前middle-first个最大或者最小的元素,并存储在[first, middle)中
template <class RandomAccessIterator, class Compare>
void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last, Compare comp);

⑦ partition:该算法的作用是按照条件对区间中的元素进行划分,使用时必须包含头文件。

template <class BidirectionalIterator, class Predicate>
BidirectionalIterator partition(BidirectionalIterator first,
BidirectionalIterator last, Predicate pred)
{
while (true)
{
while (first!=last && pred(*first)) ++first;
if (first==last--) break;
while (first!=last && !pred(*last)) --last;
if (first==last) break;
swap (*first++,*last);
}
return first;
}

reverse:该算法的作用是对区间中的元素进行逆置,使用时必须包含头文件。

template <class BidirectionalIterator>
void reverse ( BidirectionalIterator first, BidirectionalIterator last)
{
while ((first!=last)&&(first!=--last))
swap (*first++,*last);
}

sort:多个排序算法混合而成。

 unique:该函数的作用是删除区间中相邻的重复性元素,确保元素唯一性,注意在使用前要保证区间中的元素是有序的,才能达到真正的去重。

迭代器

什么是迭代器?迭代器是一种设计模式,让用户通过特定的接口访问容器的数据。迭代器本质是一个指针。

为什么需要迭代器?可以更好实现通用算法。

迭代器应该由谁负责提供?每个容器的底层结构不同,迭代器充当算法和容器之间的转化层。因此:每个容器的迭代器应该由容器设计者负责提供,然后容器按照约定给出统一的接口即可。

适配器

适配器:又接着配接器,是一种设计模式,简单的说:需要的东西就在眼前,但是由于接口不对而无法使用,需要对其接口进行转化以方便使用。即:将一个类的接口转换成用户希望的另一个类的接口,使原本接口不兼容的类可以一起工作。

仿函数

仿函数:一种具有函数特征的对象,调用者可以像函数一样使用该对象 ,为了能够“行为类似函数”,该对象所在类必须自定义函数调用运算符operator(),重载该运算符后,就可在仿函数对象的后面加上一对小括号,以此调用仿函数所定义的operator()操作,就其行为而言,“仿函数”一次更切贴。仿函数一般配合算法,作用就是:提高算法的灵活性。

上一篇:保姆级Matlab学习教程—入门之数组


下一篇:深度分析:Android4.3下MMS发送到附件为音频文件(音频为系统内置音频)的彩信给自己,添加音频-发送彩信-接收彩信-下载音频附件-预览-播放(二,发送彩信<1>)