第6章 使用库算法

新概念:迭代器适配器、标准库remove语义

 

迭代器适配器具有函数特性,它是用来产生迭代器的,而其所产生的迭代器是和调用迭代器适配器时所传递给它的参数相关的。换句话说就是它产生的迭代器是可以访问其参数中的类型的。例如:std::back_inserter

 

我这里所指的标准库remove语义是指std::remove系列的算法的语义。这些算法对一个容器中的元素进行操作,它是不会改变这个容器的特性的,也就是说不会改变容器的大小的。但是它的remove语义如何体现呢?它会将移除的元素和未被移除的元素交换位置,被移除的元素将被放到参数区间中的后部分,我们要取得被“移除”的元素就得利用其返回值,其返回的是一个迭代器,指向的是已经被移除的元素的起始位置,通过和erase函数的配合使用才能真正的删除掉容器中被移除的元素。这一点好像和我们正常的“移除”语义有点不同,我们一定要记住这个别扭的语义,以免我们写出的代码产生我们预料之外的结果。

 

新设施:std::back_inserterstd::copystd::find_ifstd::equalisalnumstd::searchisalphastd::findstd::transformstd::accumulatestd::remove_copystd::remove_copy_ifstd::remove_if

 

这里的算法和函数较多,我不做一一介绍了,大家还是查看相应的文档(如MSDN)。如果有理解不到的在讲课的时候提问。

 

新技术:static修饰符、使用标准库算法、使用迭代器适配器

 

static修饰的对象被称为“局部静态对象”,这样的对象虽然是局部的,但是它具有全局生命周期。它能够保证在第一次使用此对象之前构造,并在程序离开其作用域之后仍然保持其值不变,直到程序下一次进入并对其进行修改。static修饰往往用于一些需要在函数的不同调用中仍然能够记忆的局部对象,很简单的例子就是可以使用其来记录函数调用次数。例如下面的代码将能够在函数调用时打印出其已经被调用的次数:

#include <iostream>

 

void fun()

{

    static int calledCount = 0;

    ++calledCount;

    std::cout<<"函数已被调用:"<<calledCount<<"次!"<<std::endl;

}

 

int main()

{

    for (int i = 0; i < 10; ++i)

    {

       fun();

    }

    system("pause");

    return 0;

}

 

前面的章节我们已经介绍了一些标准库设施,包括流、容器、函数等。这一章介绍了大量的标准库泛型算法,这些标准库设施是具有一些共性的(一些统一的接口),所以这些设施往往配合使用相当方便。我不仅仅提倡使用标准库容器,还提倡使用标准库算法,它不仅仅为我们写了大量的常用算法避免我们再造车轮,而且凭借其和标准库容器等的良好接口还能让我们的程序具有更好的可维护性。再者,这些算法都是由一些C++方面的专家、权威、大师所写,经C++标准委员会精挑细选而来,其代码的结构和效率都是很优秀的,当我们无法写出更好的算法的时候,我们使用这些既有标准库算法对我们的程序是大有益处的。

 

至于这个迭代器适配器前面我已经做了介绍。这里提出一点:类似std::copy(vec1.begin(), vec1.end(), std::back_inserter(vec2));这样的代码我们将vec1容器中元素全部拷贝到vec2容器末尾,我们是不能使用vec2.end()作为第三个参数的(虽然能够通过编译),但是其运行结果不是我们想要的。因为std::copy是拷贝语义,不是插入语义,使用我们的std::back_inserter这样的迭代器适配器才能保证我们能够将拷贝的内容插入到目标容器末尾。

 

下一课:C++课堂第7章 使用关联容器 希望我的课堂对大家学习C++有所帮助

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值