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. E2PROM的尺寸

    买的E2PROM是128*8bit的, 就是只能存储128个byte, 妈的, 买小了. 实际需要的是10句, 可能加两个特殊句, "新手"跟"故障", 一共1 ...

  2. 模块已加载,但对dllregisterServer的调用失败

    在注册dll或者ocx的时候, 经常会遇到这么一个问题: 模块  已加载,但对dllregisterServer的调用失败,错误代码为0x8004***** 网上有网友回复说需要在管理员的模式下进行注 ...

  3. JS和CSS的多浏览器兼容(2)

    2.Css的浏览器兼容性 方法一,根据不同的浏览器加载不同的css file <!DOCTYPE html>  <html> <head> <title> ...

  4. 测试驱动开发神器框架Mockito

    作为菜鸟的我,以前没接触过Mock类型的框架,比如说要测试action层,我总是从action层调用service再调用dao访问数据库,这种方式从原则上来说是无疑是非常正确的,在没用mock框架之前 ...

  5. 【JQGRID DOCUMENTATION】.学习笔记.4.Navigator

    Navigator是一个将查找或编辑记录的动作,变得非常容易达到用户交互特性.开发者可以创建自定义动作,也可以使用六个预定义的动作.jqGrid为预定义的动作提供icon button图形. 一组完整 ...

  6. netstat -aon|findstr 8888 终止进程

    netstat -aon|findstr 8888 # 根据端口号查找进程C:\Users\Administrator>netstat -ano | findstr TCP LISTENING ...

  7. Hibernate,JPA注解@OneToMany_Map

    用例代码如下: 数据库DDL语句 1,CAT表 create table CAT ( id VARCHAR2(32 CHAR) not null, create_time TIMESTAMP(6), ...

  8. Python使用报错记录

    问题1:pip 报错 C:\Users\Administrator>pip3 install pyreadline Fatal error in launcher: Unable to crea ...

  9. PostgreSQL的 Slony-I 数据同步

    原文--http://www.tuicool.com/articles/mMvARf 先谈谈slony的局限性: 1. DDL动作是不会被复制到: 2. 如果想使用slony来同步数据,表必须是带有主 ...

  10. 网络统计学与web前端开发基础技术

    网络统计学与web前端开发基础技术 学习web前端开发基础技术(网页设计)需要了解:HTML.CSS.JavaScript三种语言.下面我们就来了解一下这三门技术在网页设计中的用途: HTML是网页内 ...