zoukankan      html  css  js  c++  java
  • STL中三大组件基本使用

    摘要:本文主要介绍了STL中三大组件——容器、迭代器和算法的基本使用。

    1、容器

    1.1 STL中容器的研究内容

    STL容器实际上研究的是常见的数据结构的实现。

    注意:数据结构存在的意义就是提供一种数据的特定排列方式,以方便算法的实现。

    1.2 常用的数据结构(容器)以及分类

    数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种:

    • 序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。例如:Vector容器、Deque容器、List容器等。
    • 关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。例如:Set/multiset容器 Map/multimap容器

    2、算法

    2.1 算法的概念

    以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).

    2.2 算法的分类

    算法分为:质变算法非质变算法

    • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
    • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

    3、迭代器

    3.1 迭代器的概念以及作用

    • 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。
    • 迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

    3.2 迭代器的种类

    输入迭代器

    提供对数据的只读访问

    只读,支持++、==、!=

    输出迭代器

    提供对数据的只写访问

    只写,支持++

    前向迭代器

    提供读写操作,并能向前推进迭代器

    读写,支持++、==、!=

    双向迭代器

    提供读写操作,并能向前和向后操作

    读写,支持++、--,

    随机访问迭代器

    提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器

    读写,支持++、--、[n]、-n、<、<=、>、>=

    4、三大组件的基本使用举例

    重点关注以下内容:

    4.1 vector容器的定义的方法;

    4.2 迭代器的定义和使用;

    4.3 迭代器定义的数据可以当做指针使用,明确其意义;

    4.3 遍历算法的简单使用

      1 #include <iostream>
      2 #include <string>
      3 #include<vector>
      4 #include <algorithm>  //算法头文件
      5 
      6 using namespace std;
      7 
      8 void myPrint(int v)  //为算法显示提供方法
      9 {
     10     cout << v << endl;
     11 }
     12 
     13 //用容器操作int型数据
     14 void test01() {   
     15     vector<int>v;  //定义一个名字为v的容器,存放int数据
     16 
     17     v.push_back(10);
     18     v.push_back(20);
     19     v.push_back(30);
     20     v.push_back(40);
     21     v.push_back(50);
     22 
     23     //用迭代器进行遍历
     24     for (vector<int>::iterator it=v.begin();it!=v.end();it++)
     25     {
     26         cout << *it << endl;
     27     }
     28     //利用算法进行遍历
     29     for_each(v.begin(),v.end(),myPrint);
     30 }
     31 
     32 //用容器操作自定义的数据类型
     33 class Person {    //首先定义person类
     34 public:
     35     Person(string name,int age) {
     36         this->m_age = age;
     37         this->m_name = name;
     38     }
     39     string m_name;
     40     int m_age;
     41 };
     42 
     43 void test02() {    //容器内存放的是指针类型
     44     vector<Person*>v;
     45     Person p1("小明",18);
     46     Person p2("小红",17);
     47     Person p3("李明",20);
     48 
     49     v.push_back(&p1);
     50     v.push_back(&p2);
     51     v.push_back(&p3);
     52 
     53     for (vector<Person*>::iterator it=v.begin();it!=v.end();it++)
     54     {
     55         cout << "姓名: " << (*it)->m_name << "年龄: " << (*it)->m_age << endl;
     56     }   //这里的it实际上是二级指针
     57 }
     58 void test03() {    //容器内存放的是自定义对象类型
     59     vector<Person>v;
     60     Person p1("小明", 18);
     61     Person p2("小红", 17);
     62     Person p3("李明", 20);
     63 
     64     v.push_back(p1);
     65     v.push_back(p2);
     66     v.push_back(p3);
     67 
     68     for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
     69     {
     70         cout << "姓名: " << it->m_name << "年龄: " << (*it).m_age << endl;
     71     }//这里可以看书迭代器定义的可以按照指针来理解
     72 }
     73 //容器嵌套容器
     74 void test04() {
     75     vector<vector<int>>v;
     76 
     77     vector<int>v1;//定义大容器中的内容
     78     vector<int>v2;
     79     vector<int>v3;
     80 
     81     for (int i=0;i<5;i++) //将int数据放到各个小容器中
     82     {
     83         v1.push_back(i);
     84         v2.push_back(i+6);
     85         v3.push_back(i+8);
     86     }
     87 
     88     v.push_back(v1);  //将各个定义好的小容器放到大容器中
     89     v.push_back(v2);
     90     v.push_back(v3);
     91 
     92     //遍历所有数据
     93     for (vector<vector<int>>::iterator it=v.begin();it!=v.end();it++)
     94     {
     95         for (vector<int>::iterator itv=it->begin();itv!=it->end();itv++)
     96         {
     97             cout << *itv << " ";
     98         }
     99         cout << endl;
    100     }
    101 }
    102 int main() {
    103     //test01();
    104     //test02();
    105     //test03();
    106     test04();
    107     system("pause");
    108     return 0;
    109 }
  • 相关阅读:
    angularjs的$on、$emit、$broadcast
    angularjs中的路由介绍详解 ui-route(转)
    ionic入门教程-ionic路由详解(state、route、resolve)(转)
    Cocos Creator 加载使用protobuf第三方库,因为加载顺序报错
    Cocos Creator 计时器错误 cc.Scheduler: Illegal target which doesn't have uuid or instanceId.
    Cocos Creator 构造函数传参警告 Can not instantiate CCClass 'Test' with arguments.
    Cocos Creator 对象池NodePool
    Cocos Creator 坐标系 (convertToWorldSpaceAR、convertToNodeSpaceAR)
    Cocos Creator 常驻节点addPersistRootNode
    Cocos Creator 配合Tiled地图的使用
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11357119.html
Copyright © 2011-2022 走看看