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学习笔记--directive
    angularjs 路由(1)
    走进AngularJs(一)angular基本概念的认识与实战
    angularjs- 快速入门
    从angularJS看MVVM
    中软国际 问题一php的优缺点
    elasticsearch head安装后无法连接到es服务器问题
    Laravel5.3 流程粗粒度分析之bootstrap
    mysql执行大量sql语句
    Laravel RuntimeException inEncrypter.php line 43: The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11357119.html
Copyright © 2011-2022 走看看