zoukankan      html  css  js  c++  java
  • 容器和算法2

    迭代器:

      上一节我们的栗子虽然工作得很好并也使用了一个标准的容器(向量容器),但它还是有个小问题。就是在漏历向量里的各个元素时,我们仍把它视为一个C++数组来对待。
      刚好我们的向量容器允许使用下表操作符来访问它的各个元素:names[x]。但是如果想改用另一种不提供此方法访问的容器(比如栈),我们就不得不对程序做很多修改才得以实现。

      因为对容器里的各个元素进行遍历是一种十分常见的任务,所以应该有一种标准的方式来做这件事,对吧?
      C++标准库提供的各种迭代器(iterator)就是这么来的。
      迭代代器是一种功能非常有限却非常实用的函数,提供一些基本操作符:*、++、==、!=、=。迭代器是个所谓的智能指针,具有遍历复杂数据结构的能力。

      因为迭代器的功能是如此的基本,所以标准库里的每一种容器都支持。
      通过使用迭代器,当在程序里改用另一种容器的时候就用不着修改那么多的代码了。
      每一种容器都必须提供自己的迭代器,事实上每种容器都将其迭代器以嵌套的方式定义于内部。因此各种送代器的接口相同,型号却不同,这就是所谓泛型程序设计的概念:所有操作行为都随用相同接口,虽然它们的具体实现不同。

      修改vector.cpp,使用送代器。

    #include <iostream>
    #include <string>
    #include <vector>
    int main()
    {
    	std::vector<std::string> names;
    	
    	names.push_back("猫");
    	names.push_back("狗");
    	
    	std::vector<std::string>::iterator i = names.begin();
    	
    	while(i != names.end())
    	{
    		std::cout << *i <<"
    ";
    		++i;
    	}
    	
    	return 0;
    	 
    }
    

      

    算法

      回顾我们刚才对向量示例程序的修改,别的先不说,用来遍历向量元素的循环比原来复杂了许多,可代码的行为还是老样子。迭代器的真正价值体现在它们可以和所有的容器配合使用,而使用送代器去访问容器元素的算法可以和任何一种容器配合使用。

      小甲鱼将带大家再修改一下这个栗子,从而演示等法的成力:在输出该容器里的元素之前,先按字母顺序对它们进行排序。
      对数据进行排序对人类来说好像只是个简单的问题,但要想高效率地完成这个任务其实并没有想象中那么简单。
      人们已经对排序问题总结出许多不同的算法:冒泡排序、堆排序、快速排序等等。
      每种算法都有它们的优点和缺点,而只有那些最简单的算法才比较容易以我们个人之力实现。

      所幸的是,C++标准库包含着一个经过全面优化的排序等法,它的处理速度也非常理想。
      要想使用这个算法,只需先把algorithm文件包含到源文件里:#include <algorithm>
      然后再像下面这样调用sort()方法就可以了:

    std::sort(beginIterator,endIterator);
    

      演示:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    int main()
    {
    	std::vector<std::string> names;
    	
    	names.push_back("Larry");
    	names.push_back("Rola");
    	names.push_back("DingDiang");
    	names.push_back("JoyJoy");
    	names.push_back("Michael");
    	names.push_back("Lilei");
    	
    	std::sort(names.begin(), names.end());
    	
    	std::vector<std::string>::iterator i = names.begin();
    	
    	while(i != names.end())
    	{
    		std::cout << *i <<"
    ";
    		++i;
    	}
    	
    	return 0;
    	
    	return 0;
    	 
    }
    

      结果:

    DingDiang
    JoyJoy
    Larry
    Lilei
    Michael
    Rola
    请按任意键继续. . .
    

      

     



  • 相关阅读:
    commons-fileupload源码学习心得
    commons-io源码阅读心得
    java反射机制
    构建简单的socket连接池
    maven主仓库中找不到restlet的解决办法
    修改eclipse中web项目的server部署路径
    Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project '项目名'
    JVM中的Stack和Heap
    JVM工作原理和特点
    spring mvc 3.1的自动注入参数遇到的问题
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/10500187.html
Copyright © 2011-2022 走看看