C++primer第4版第十一章泛型算法

来源:互联网 发布:极限编程特点 编辑:程序博客网 时间:2024/06/05 07:53

Talk is cheap, show me the code.

  1. 常用的在某容器或者内置数组中查找某个值,使用find标准库函数,必须先包含algorithm头文件,该文件还定义了find_if函数,支持找到满足自定义条件的元素第一次出现的位置:

    vector<int> vect = {1, 2, 3};
    vector<int>::iterator it = find(vect.begin(), vect.end(), 2);
    cout << ( it == vect.end())?"not found":"exist!";

    int a[3] = {1, 2, 3};
    int *p = find(a, a + 3, 2);
    cout << (p == (a + 3))?"not found":"exist!";

    bool gt2(int a)
    {
    return (a >= 2);
    }
    vector<int> vect = {1, 2, 3};
    cout << *find_if(vect.begin(), vect.end(), gt2) << endl; //找到第一个不小于2的元素位置的元素,结果为2

  2. 标准算法库还提供在某容器或者内置数组中统计某成员出现的次数的函数count:

    list<int> lst = {1, 2, 3, 2]
    cout << count(lst.begin(), lst.end(), 2) << endl;

  3. 对容器进行初始化,可以采用头文件algorithm中的fill或者fill_n,注意fill_n不检查是否超出了容器原有大小,所以需要配合使用头文件iterator中的back_inserter迭代器来完成赋值操作,back_inserter是允许创建元素的插入迭代器。

    vector<int> vect(2);
    fill(vect.begin(),vect.begin() + 5, 3); //right, 用3填充迭代器范围内现有的元素 ,超出范围的不创建新元素
    vector<int> v1;
    fill_n(back_inserter(v1), 10, 3); //right, 使用3填充指定个数的元素,这里是10个,没有的元素会进行创建
    fill_n(v1.begin(), 10, 3); //wrong, 赋值失败,v1为空,没有的元素也不会创建,最终v1还是空

  4. 对容器元素进行排序,可以使用头文件algorithm中的sort或者stable_sort,stable_sort对于相等的元素保持原来的排列顺序。两者都可以通过第三个参数指定排序方式,默认都是按元素类型 < 运算排序,前两个参数都是容器的前后迭代器。

    bool isbigger(int a, int b)
    {
    return (a > b)?true:false;
    }
    int main()
    {
    vector<int> vect = {4, 4, 2, 1, 3, 3};
    sort(vect.begin(), vect.end()); //结果为 1 2 3 3 4 4
    sort(vect.begin(), vect.edn(), isbigger); //结果为4 4 3 3 2 1
    stable_sort(vect.begin(), vect.end()); //结果为 1 2 3 3 4 4,其中3 和 4 相同元素都保持了原来的次序
    stable_sort(vect.begin(), vect.end(), isbigger); //结果为 4 4 3 3 2 1,其中相同元素都保持了原来的次序
    }

  5. 对容器元素进行统计计数,可以使用头文件algorithm中的count或者count_if, count_if支持使用自定义的条件来统计满足条件的元素个数。

    bool gt4(int a)
    {
    return (a >= 4);
    }
    vector<int> vect = {1, 3 ,4 ,3 ,4, 5};
    cout << count(vect.begin(), vect.end(), 3); //统计vect中元素为3的个数,结果为 2
    cout << count_if(vect.begin(), vect.end(), gt4); //统计vect中元素不小于4的个数,结果为3

  6. 反向迭代器reverse_iterator包含在iterator头文件中,容器的rbegin()返回的迭代器指向容器的最后一个位置,rend()返回的迭代器指向容器的第一个元素的前一个元素位置,如果要将reverse_iterator转换为正序的iterator,只需要调用base()函数即可。

    vector<int> vect = {1, 2, 3, 4};
    for ( vector<int>::reverse_iterator rt = vect.rbegin(); rt != vect.end(); ++rt)
    {
    cout << *rt << " ";
    }
    cout << endl;
    vector<int>::reverse_iterator rt = vect.rend();
    cout << *rt.base() << endl;

  7. 注意标准库algorithm中定义的sort等函数对于随机访问迭代器效率较高,但是对于list这种双向迭代器效率却比较低,对于list可以直接采用list自有的sort()函数来进行排序。

0 0
原创粉丝点击