C++ STL标准模板库(list)

2023-05-16

 


引用头文件   #include<list>

list类本身是一个类模板

list链表中的迭代器list类模板的一个内部类 这个类实现了链表元素指针的功能是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定
的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指5针将有序的元素链接起来。
由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后,它的检索时间就越长。检索时间与目标元素的位置成正比。虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有所影响,这一点是vector 不可比拟的。
list 的特点:
(1) 不使用连续的内存空间这样可以随意地进行动态操作;
(2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop 。
(3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;
Lists将元素按顺序储存在链表中,与向量(vectors)相比,它允许快速的插入
和删除,但是随机访问却比较慢.


 

//list的使用
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<list>
using namespace std;


class Student{
public:
    int age;
    char name[30];
};

void Print(){
}

void ProtectA(){
    Student s1, s2, s3;
    s1.age = 12;
    strcpy(s1.name, "小米");
    s2.age = 14;
    strcpy(s2.name, "小红");
    s3.age = 16;
    strcpy(s3.name, "小刚");
    list<Student *> ldata;
    //从后面添加一个元素
    ldata.push_back(&s1);
    ldata.push_back(&s2);
    ldata.push_back(&s3);
    //定义迭代器
    //list<Student *>::iterator current = NULL;
    //报错 :error C2440: “初始化”: 无法从“int”转换为“std::_List_iterator<std::_List_val<std::_List_simple_types<Student *>>>”
    //说明  list<Student *>::iterator本质上是list<Student *>类的一个内部类
    //这个内部类重载了=运算符   构造函数可以接受一个指针
    
    /*
    begin()方法返回的是链表头元素的迭代器
    */
    list<Student *>::iterator current = ldata.begin();
    //强调current是个内部类  不是指针  但是迭代器的功能相当于链表元素的指针
    //迭代器步长是一个元素类型大小的字节
    for (current; current != ldata.end(); current++)
    {
        Student *temp = *current;
        //迭代器这个内部类重载了*运算符
        cout << "学生姓名:" << temp->name << ";学生年龄是:" << temp->age << endl;
    }
}

void ProtectB(){
    Student s1, s2, s3;
    s1.age = 12;
    strcpy(s1.name, "小米");
    s2.age = 14;
    strcpy(s2.name, "小红");
    s3.age = 16;
    strcpy(s3.name, "小刚");
    list<Student> ldata;
    ldata.push_back(s1);
    ldata.push_back(s2);
    ldata.push_back(s3);
    list<Student>::iterator current = ldata.begin();
    for (current; current != ldata.end(); current++)
    {
        //Student *temp = current;
        //报错 :     2    IntelliSense:  不存在从 "std::_List_iterator<std::_List_val<std::_List_simple_types<Student>>>" 到 "Student *" 的适当转换函数    g:\test\SolutionC3\C001\tec01.cpp    
        //简单来说没有实现=操作符重载  所以无法赋值
        //2个操作数  左操作数类型是 Student *  用户没写  c++编译无法编译通过
        cout << "学生姓名:" << current->name << ";学生年龄是:" << current->age << endl;
        //迭代器内部类重载了->操作符
    }
}

void main(){
    ProtectA();
    system("pause");
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL标准模板库(list) 的相关文章

  • 如何在 Python 中从平面列表构建嵌套列表? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个简单的列表 例如 flat 1 1 1 1 1 1 1 2 2 2 1 2 2 3 我需要转换为嵌套列表 其中每个级别 破折号后跟数
  • Python如何拆分列表列表?

    我有一个清单清单 myList 1 2 3 4 5 6 7 8 9 10 我想将其分成三个单独的列表 每个列表都有自己的名称 a 1 2 3 b 4 5 6 c 7 8 9 10 我该怎么做呢 您可以直接解压它 a b c myList
  • 如何从 wfstream 读取二进制数据?

    我从文件读取数据时遇到一个小问题 我希望能够读取 wstring 以及任意大小的原始数据块 大小以字节为单位 std wfstream stream file c str std wstring comType stream gt gt c
  • 在 Django 中为多个查询编写视图的最佳方法?

    这是一个简单的问题 我已经组织了我的模型 以便提供给页面的大多数对象都属于一种类型 项目 该模型包含各种属性 可以帮助我以不同的方式提供服务 我有文章和视频 它们由模型上的 类型 字段确定 类型 文章 等 我有一个列表视图 它显示项目模型中
  • Python 中的“Zip”列表字典

    我有一个列表字典 我想将它们合并到一个命名元组列表中 我想要第一个元组中所有列表的第一个元素 第二个元组中的第二个元素 依此类推 Example key1 1 2 3 key2 4 5 6 key3 7 8 9 我希望生成的列表如下所示 k
  • C++ 相当于 std::vector 上的 numpy.unique,具有 return_index 和 return_inverse

    numpy有一个实施unique返回的算法 the 排序的唯一元素一个 numpy 数组 i e 没有重复项 此外 numpy unique https numpy org doc stable reference generated nu
  • 如何加快列表理解速度

    以下是我的清单 col red yellow blue red green yellow pink orange brown pink brown 我的目标是消除每个列表中出现一次的项目 这是我的代码 eliminate w for w i
  • 是否有一个 jquery List 插件可以自动排序项目并具有强大的添加/删除方法?

    我已经在谷歌上搜索了几个小时 寻找一些东西来处理我的情况 我还不够熟练 无法编写自己的 jquery 插件 该插件应该自动对列表进行排序 这并不像能够轻松地从列表中添加 删除项目那么重要 Themeroller 功能将是一个优点 我基本上会
  • 如何将 BOOST_FOREACH 与两个 std::map 一起使用?

    我的代码基本上如下所示 std map
  • 使用 Linq 返回具有最大计数的列表

    使用 C 和 Linq 如何返回具有最大大小 计数的 List 我假设您有一个名为的列表集合lists并且您想要返回此集合中元素最多的列表 如果是这样 请尝试以下操作 var listWithLargestCount lists Order
  • 如何在 LINQ 中执行 String.Replace?

    这是我正在尝试做的事情 但没有成功 我想打电话from x in list1 and join y in list2 where regex Match x Value Success 完成这些步骤后我需要打电话String Replace
  • 使用 std::min_element() 时保存函数计算

    假设给你一个 2D 点向量 并期望找到最少的点欧几里得范数 http en wikipedia org wiki Norm 28mathematics 29 Euclidean norm 点提供为std vector
  • Python:两个列表之间的成对比较:列表 a >= 列表 b?

    如果我想检查列表中的所有元素 a 1 2 3 6 大于或等于另一个列表中对应的元素 b 0 2 3 5 如果 a i gt b i 对于所有i的 则返回 true 否则返回 false 这有逻辑功能吗 比如a gt b 谢谢 你可以这样做
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • Python-使用元组作为列表索引[重复]

    这个问题在这里已经有答案了 我有一个元组列表 tuples list 1 0 2 3 3 2 2 0 我想访问二维数组的元素a例如 使用其中一些元组 for i in range 3 print a tuples list i 应该输出的值
  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • 如何从Python列表中的字符串中删除双引号?

    我正在尝试在字典列表中获取一些数据 数据来自 csv 文件 因此都是字符串 文件中的键都有双引号 但由于这些都是字符串 我想删除它们 这样它们在字典中看起来像这样 key value 而不是这个 key value 我尝试简单地使用 str
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 属性错误:“列表”对象没有属性“拆分”

    我正在尝试读取一个文件并用逗号分隔每行中的一个单元格 然后仅显示第一个和第二个单元格 其中包含有关纬度和经度的信息 这是文件 time 纬度 经度 类型2015 03 20T10 20 35 890Z 38 8221664 122 7649

随机推荐