zoukankan      html  css  js  c++  java
  • STL--list

    List-概述:

      列表List是一个线性链表结构(Double—Linked Lists,双链表),它的数据由若干个节点构成,每一个节点都包括一个信息块Info(即实际存储的数据)、一个前驱指针Pre和一个后驱指针Post。
    它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。
     
     

    list <TYPE> c

    产生一个空list,其中没有任何元素

    list<TYPE>   c1(c2)

    产生一个与c2同型的list(每个元素都被复制)

    list<TYPE>   c(n)

    产生拥有n个元素的list,都以default构造函数初始化

    list<TYPE>   c(n, type)

    产生拥有n个元素的list,每个元素都是type的副本

    list<TYPE>   c (beg, end)

    产生一个list,并以[start,   end)区间内的元素为初始

    c.~list<TYPE>()

    销毁所有元素,释放内存

     
     
     

    TYPE &back()

    TYPE &front()

    返回对最后一个元素的引用

    返回对第一个元素的引用

    iterator   begin()

    iterator   end()

    返回指向第一个元素的迭代器

    返回指向末尾(最后一个元素之后)的迭代器

    void   clear()

    清空链表

    bool   empty()

    如果链表为空返回true,否则返回false

    iterator   erase(iterator pos)

    iterator   erase(iterator start, iterator end)

    删除pos所指元素并返回下一元素迭代器

    删除[start,   end)之间的元素,并返回最后一个被删除元素的下一个元素的迭代器

    iterator   insert( iterator pos,   const   TYPE &val   )

    插入一个值为value的元素在pos位置并返回其迭代器,原pos及以后的元素后移

    void   insert( iterator pos, size_type num, const TYPE &val)

    插入num个值为value的元素在pos位置,原pos及以后元素后移

    ……

     
     
     
     
    题目练习:
        1. 约瑟夫环问题:  故事背景略, 请自行百度(我这是有多懒!)。 输入三个正整数, 分别为 n, k, m。 即:共有n个人围成一个队列, 有一个人在从第k个人开始数, 数到第m个, 第m个人出队。然后从他后面那个人开始, 继续开始数, 同样数到的第m个出队。 如果数到队列末尾, 就接着数第一个人,,, 输出这n个人的 出队序列。
      输入示例: 5 3 3
      输出示例: 5 3 2 4 1
     
     

         链表实现

     1 #include <iostream>
     2 #include <list>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int n, k, m; 
     8     cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
     9     while (cin >> n >> k >> m)
    10     {
    11         if(k>n||n<0||k<0||m<0) 
    12         {
    13             cout << "输入有误, 请注意(k < n, k, m, n > 0)
    "; 
    14             continue; 
    15         }
    16         list<int> Li(n);
    17         list<int>::iterator it = Li.begin(), pos = Li.begin(); // 用pos的指示走到的位置 
    18         // 初始化链表 
    19         for( int i = 1; it != Li.end(); ++i, ++it)
    20         *it = i;
    21         
    22         int t = (k-2+n) % n + 1;
    23         while(--t) // 初始化 pos 指示的位置即:从(k-1)开始数 
    24         {
    25             pos++; 
    26             if(pos == Li.end()) 
    27             pos = Li.begin();
    28         }
    29         while(n--)     // 队列中剩余的人数 n 
    30         {
    31             int t = m;
    32             while(t--)    // 走m步 
    33             {
    34                 pos++;         
    35                 if(pos == Li.end()) 
    36                 pos = Li.begin();  // 走 m 步后的pos指示的位置 
    37             } 
    38             cout << *pos << ", "; // 出队 
    39             it = pos; it--;  // 用 it 暂存 pos的位置,由于pos将被删除,
    40                              //所以下次开始数的位置为现在pos所指位置的前一个位置 
    41             Li.erase(pos); // 删除 出队的人。  
    42             pos = it; 
    43         }
    44         cout << endl << endl; 
    45         cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
    46         
    47     }
    48     return 0; 
    49 }
    View Code

      附数组实现

     1 #include <iostream>
     2 const int MAXN = 50; 
     3 using namespace std;
     4 
     5 int n, k, m, a[MAXN];
     6 
     7 int Move(int p, int t);    // 输入开始位置 p, 固定循环长度t; 返回:出队人的位置 
     8 
     9 int main()
    10 {
    11     cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
    12     while((cin >> n >> k >> m))
    13     {
    14         if(k>n) 
    15         {
    16             cout << "输入有误, 请注意(k < n, k, m, n > 0)
    "; 
    17             continue; 
    18         }
    19         for(int i = 1; i <= n; i++) a[i] = n;
    20         int left = n;  // left 为队列中还剩余的人数。 
    21         int p = k-1 + n; 
    22         while(left)
    23         {
    24             p = Move(p, m); 
    25             cout << p << ", ";
    26             left--;
    27             a[p] = 0;    // 标记这个位置的人已经出队。 
    28         }        
    29         cout << endl << endl;
    30         cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
    31     }
    32     return 0; 
    33 }
    34 
    35 int Move (int p, int t)
    36 {
    37     while(t--)
    38     {
    39         do { p = p % n + 1; } while(a[p] == 0); // 忽略已经出队的人
    40     }
    41     return p; 
    42 }
    View Code
  • 相关阅读:
    Android网络框架之Retrofit + RxJava + OkHttp 变化的时代
    网易与Google合作发布开源UI自动化测试方案 牛逼:Google 方面评价,这可能是目前世界上最好的 Android 游戏自动化测试方案。
    GitHub上受欢迎的Android UI Library
    推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)
    pytest 一个测试类怎样使用多种fixture前置方法
    Appium服务器初始化参数(Capability)
    pytest执行用例:明明只写了5个测试用例, 怎么收集到33个!?
    解决VirtualBox 运行时报内存不能written
    VirtualBox 虚拟机怎样设置共享文件夹
    简单通俗讲解 android 内存泄漏
  • 原文地址:https://www.cnblogs.com/acm1314/p/4540608.html
Copyright © 2011-2022 走看看