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
 
 

链表实现

 #include <iostream>
#include <list>
using namespace std; int main()
{
int n, k, m;
cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
while (cin >> n >> k >> m)
{
if(k>n||n<||k<||m<)
{
cout << "输入有误, 请注意(k < n, k, m, n > 0)\n";
continue;
}
list<int> Li(n);
list<int>::iterator it = Li.begin(), pos = Li.begin(); // 用pos的指示走到的位置
// 初始化链表
for( int i = ; it != Li.end(); ++i, ++it)
*it = i; int t = (k-+n) % n + ;
while(--t) // 初始化 pos 指示的位置即:从(k-1)开始数
{
pos++;
if(pos == Li.end())
pos = Li.begin();
}
while(n--) // 队列中剩余的人数 n
{
int t = m;
while(t--) // 走m步
{
pos++;
if(pos == Li.end())
pos = Li.begin(); // 走 m 步后的pos指示的位置
}
cout << *pos << ", "; // 出队
it = pos; it--; // 用 it 暂存 pos的位置,由于pos将被删除,
//所以下次开始数的位置为现在pos所指位置的前一个位置
Li.erase(pos); // 删除 出队的人。
pos = it;
}
cout << endl << endl;
cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl; }
return ;
}

  附数组实现

 #include <iostream>
const int MAXN = ;
using namespace std; int n, k, m, a[MAXN]; int Move(int p, int t); // 输入开始位置 p, 固定循环长度t; 返回:出队人的位置 int main()
{
cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
while((cin >> n >> k >> m))
{
if(k>n)
{
cout << "输入有误, 请注意(k < n, k, m, n > 0)\n";
continue;
}
for(int i = ; i <= n; i++) a[i] = n;
int left = n; // left 为队列中还剩余的人数。
int p = k- + n;
while(left)
{
p = Move(p, m);
cout << p << ", ";
left--;
a[p] = ; // 标记这个位置的人已经出队。
}
cout << endl << endl;
cout << "请分别输入总人数: n, 开始位置: k, 循环节: m." << endl;
}
return ;
} int Move (int p, int t)
{
while(t--)
{
do { p = p % n + ; } while(a[p] == ); // 忽略已经出队的人
}
return p;
}

STL--list的更多相关文章

  1. 详细解说 STL 排序(Sort)

    0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...

  2. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  3. STL的std::find和std::find_if

    std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...

  4. STL: unordered_map 自定义键值使用

    使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...

  5. C++ STL简述

    前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...

  6. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  7. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

  8. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  9. STL的使用

    Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...

  10. [C/C++] C/C++延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

随机推荐

  1. Linux之sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  2. android 中 listview 设置自动匹配高度

    1.布局文件 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:l ...

  3. oracle 导出表结构和数据,使用plsql

    比如说需要把A数据库里面的数据,导入到B数据库 准备工作:在B数据库中创建B数据库同名的的用户名和表空间,注意大小写必须一样. 1,导出表结构.A数据库里点击工具栏里的tools--Export Us ...

  4. 不定参数的传递VA_LIST的用法

    VA_LIST的用法:(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针: (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,使其指向第一个可 变参数的地址: ...

  5. MySQL数据类型总结

    MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. 日期和时间数据类型 MySQL数据类型 含义 date 3字节,日期,格式:2014-09-18 t ...

  6. javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    DateFormat:格式化日期的工具类,本身是一个抽象类: NumberFormat:格式化 数字 到 数字字符串,或货币字符串的字符类; MessageFormat: 可以格式化模式字符串,模式字 ...

  7. 【20160924】GOCVHelper MFC增强算法(3)

        //获得当前目录路径     static CString GetLocalPath(){         CString csCfgFilePath;         GetModuleFi ...

  8. Log4net使用指南

    请在这里下载示例代码 1           简介 1.1          Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的 ...

  9. Codeforces Round #368 (Div. 2) A

    Description Small, but very brave, mouse Brain was not accepted to summer school of young villains. ...

  10. 2016年11月27日 星期日 --出埃及记 Exodus 20:18

    2016年11月27日 星期日 --出埃及记 Exodus 20:18 When the people saw the thunder and lightning and heard the trum ...