C++ STL容器之 list 初步

#include <iostream>
#include<algorithm>
#include <string>
#include <list>
using namespace std;//3.6.4.1 list构造函数
//list<T> lstT;//list采用采用模板类实现,对象的默认构造形式:
//list(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
//list(n, elem);//构造函数将n个elem拷贝给本身。
//list(const list& lst);//拷贝构造函数。
//3.6.4.2 list数据元素插入和删除操作
//push_back(elem);//在容器尾部加入一个元素
//pop_back();//删除容器中最后一个元素
//push_front(elem);//在容器开头插入一个元素
//pop_front();//从容器开头移除第一个元素
//insert(pos, elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
//insert(pos, n, elem);//在pos位置插入n个elem数据,无返回值。
//insert(pos, beg, end);//在pos位置插入[beg,end)区间的数据,无返回值。
//clear();//移除容器的所有数据
//erase(beg, end);//删除[beg,end)区间的数据,返回下一个数据的位置。
//erase(pos);//删除pos位置的数据,返回下一个数据的位置。
//remove(elem);//删除容器中所有与elem值匹配的元素。
//
//
//3.6.4.3 list大小操作
//size();//返回容器中元素的个数
//empty();//判断容器是否为空
//resize(num);//重新指定容器的长度为num,
//若容器变长,则以默认值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
//resize(num, elem);//重新指定容器的长度为num,
//若容器变长,则以elem值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
//
//3.6.4.4 list赋值操作
//assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
//assign(n, elem);//将n个elem拷贝赋值给本身。
//list& operator=(const list& lst);//重载等号操作符
//swap(lst);//将lst与本身的元素互换。
//3.6.4.5 list数据的存取
//front();//返回第一个元素。
//back();//返回最后一个元素。
//3.6.4.6 list反转排序
//reverse();//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
//sort(); //list排序//打印数据
void printInt(list<int>& l) {for (list<int>::iterator it = l.begin(); it != l.end(); ++it) {cout << *it << endl;}
}void test1() {list<int> l;for (int i = 0; i < 5; i++) {l.push_back(i);}list<int> l2(10, 88);list<int> l3(l2.begin(), l2.end());printInt(l2);printInt(l3);l2.push_back(100);//逆序打印for (list<int>::reverse_iterator it = l2.rbegin(); it != l2.rend(); ++it) {cout << *it << endl;}// list容器不支持随机访问迭代器list<int>::iterator it_1 = l.begin();//it_1 = it_1 + 1; // 插入数据  尾插  头插list<int> l1;l1.push_back(23);l1.push_front(233);//删除两端数据  尾删 头删l1.pop_back();l1.pop_front();// insert 插入数据l1.insert(l1.begin(), 1000);//remove 删除数据l1.remove(1000);// list大小cout << l1.size() << endl;}bool intPare(int a, int b) {return a > b;
}void test2() {list<int> l4;l4.assign(5, 2);//printInt(l4);list<int> l5;l5.push_back(234);l5.push_back(89);l5.assign(l4.begin(), l4.end()); // 这样l5之前的数据就没有了printInt(l5);l5.push_front(563);// 不支持随机访问迭代器的容器, 都不能用系统排序sort// X sort(l5.begin(), l5.end());l5.sort();// 默认升序printInt(l5);l5.sort(intPare);  // 自定义排序printInt(l5);  l5.reverse();// 反转
}//list 操作自定义类型
class Person {
public:Person(string name, int age, int height) {this->m_name = name;this->m_age = age;this->m_height = height;}bool operator== (const Person &p) {return this->m_age == p.m_age && this->m_height == p.m_height && this->m_name == p.m_name;}string m_name;int m_age;int m_height;
};// 年龄降序, 年龄一样的话, 按照身高升序来
bool personParse(Person &p1, Person &p2) {if (p1.m_age == p2.m_age) {return p1.m_height < p2.m_height;}return p1.m_age > p2.m_age;
}
void printPerson(const list<Person> &l) {for (list<Person>::const_iterator it = l.begin(); it != l.end(); ++it) {cout << (*it).m_name << "age is" << (*it).m_age << "height is" << (*it).m_height << endl;}
}
void test3() {list<Person> l;Person p1("A", 50, 172);Person p2("B", 23, 182);Person p3("C", 78, 178);Person p4("D", 29, 183);Person p5("E", 29, 180);l.push_back(p1);l.push_back(p2);l.push_back(p3);l.push_back(p4);l.push_back(p5);//l.sort(); 对于自定义数据类型,需要自定义排序规则l.sort(personParse);printPerson(l);// list 容器删除自定义类型数据Person  p6("E", 29, 180);l.remove(p6);  //??? 这里不知道为什么报错,// 二进制“==”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换printPerson(l);
}
int main()
{//test1();//test2();test3();return 0;
}

list是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
ist容器不仅是一个双向链表,而且还是一个循环的双向链表。

list所支持迭代器为双向迭代器

不支持系统的sort排序, list有自己的sort成员函数

疑惑:??? list在删除自定义数据类型是报错
二进制“==”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)
这里先记录下, 后期明白了, 再来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ STL容器值set

/* 3.7.2 set常用API 3.7.2.1 set构造函数 set<T> st;//set默认构造函数&#xff1a; mulitset<T> mst; //multiset默认构造函数: set(const set& st);//拷贝构造函数 3.7.2.2 set赋值操作 set & operator(const set & st);//重载等号操作符 swap(st)…

C++ STL容器之map 简单使用

3.8.2.1 map构造函数 map<T1, T2> mapTT;//map默认构造函数: map(const map &mp);//拷贝构造函数3.8.2.2 map赋值操作 map& operator(const map &mp);//重载等号操作符 swap(mp);//交换两个集合容器3.8.2.3 map大小操作 size();//返回容器中元素的数目 empty…

Manacher算法图解

看了好久的Manacher算法&#xff0c;觉得还是要自己画一遍&#xff0c;自己把代码写一遍才能理解 下面分享一下&#xff0c;如果有错&#xff0c;希望指正 简陋版本的&#xff0c;但是他基本只是做到了求取最长回文字符串&#xff0c;严格来说它并不是Manacher’s Algorithm-…

Flink 客户端操作命令及可视化工具

Flink提供了丰富的客户端操作来提交任务和与任务进行交互。下面主要从Flink命令行、Scala Shell、SQL Client、Restful API和 Web五个方面进行整理。 在Flink安装目录的bin目录下可以看到flink&#xff0c;start-scala-shell.sh和sql-client.sh等文件&#xff0c;这些都是客户…

ySQL挑战搭建一个简易的成绩管理系统的数据库

文章为自己搜索网上资源&#xff0c;再在这里进行整理&#xff0c;所以标注为转载 [实验步骤](https://www.shiyanlou.com/courses/reports/1347700) 总结做实验注意事项&#xff1a; 1.添加主键 2.主键和外键的关系 3.注意自增的书写添加 mysql 如何修改、添加、删除表主键…

网络之DNS协议图解

DNS是计算机域名系统 (Domain Name System) 域名系统采用类似目录树的等级结构。 域名服务器是指保存有该网络中所有主机的域名和对应IP地址&#xff0c;并具有将域名转换为IP地址功能的服务器。 域名服务器为客户机/服务器模式中的服务器方&#xff0c;它主要有两种形式&am…

C++ 谓词,

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <vector> #include <algorithm> using namespace std;class GreaterThen20 { public:bool operator()(int val){return val > 20;} };//一元谓词 void test01() {vector<int>v;v.push…

网络之ARP

地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。 主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确定目标的物理地址…

C++ 内建函数对象

STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象&#xff0c;逻辑运算类仿函数。这些仿函数所产生的对象&#xff0c;用法和一般函数完全相同&#xff0c;当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象&#xff0c;需要引入头文件 functi…

网络之ICMP协议

ICMP 主要功能&#xff1a; 确认IP包是否成功送达目标地址通知在发送过程当中IP包被废弃的具体原因改善网络设置等 在IP通信中如果某个IP包因为某种原因未到达目标地址&#xff0c;那么这个原因由ICMP通知。 过程&#xff08;图解TCP/IP&#xff09; ICMP类型 常见的&am…

C++ 常用算法之遍历

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <algorithm> #include <vector> #include <functional> using namespace std;/* 遍历算法 遍历容器元素 param beg 开始迭代器 param end 结束迭代器 param _callback 函数回调或者函数…

网络之NAT协议

由来&#xff1a; 2011年2月3日中国农历新年&#xff0c; IANA对外宣布&#xff1a;IPv4地址空间最后5个地址块已经被分配给下属的5个地区委员会。2011年4月15日&#xff0c;亚太区委员会APNIC对外宣布&#xff0c;除了个别保留地址外&#xff0c;本区域所有的IPv4地址基本耗尽…

C++ 常用查找算法

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <algorithm> using namespace std; #include <vector> #include <string> #include <functional> /* find算法 查找元素 param beg 容器开始迭代器 param end 容器结束迭代器 para…

CentOS7卸载并安装mysql教程

MySQL安装 先卸载其他 删除Mysql yum remove mysql mysql-server mysql-libs mysql-server;find / -name mysql 将找到的相关东西delete掉(rm -rf /var/lib/mysql)&#xff1b;rpm -qa|grep mysql(查询出来的东东yum remove掉) rm /etc/my.cnf查看是否还有mysql软件&#x…

C++ 常用排序算法

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include <algorithm> #include <vector> #include <functional> #include <ctime> /* merge算法 容器元素合并&#xff0c;并存储到另一容器中 这两个容器 必须也是…

排序稳定性的意义

首先&#xff0c;为什么会有排序算法稳定性的说法&#xff1f;只要能排好不就可以了吗&#xff1f; 看例子 第1行是数字2 记作 1 2 第2行是数字4 记作 2 4 第3行是数字2 记作 3 2 排序后的结果&#xff08;如果看不懂命令的意思&#xff0c;参照这个博客&#xff09; 那么引入…

C++ 常用拷贝和替换算法

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std;/* copy算法 将容器内指定范围的元素拷贝到另一容器中 param beg 容器开始迭代器 param end 容器结束迭代器 p…

防火墙的基础知识入门

文章目录防火墙基于实现方式&#xff0c;防火墙的发展分为四个阶段:Linux 环境中主要的防火墙形式TCP wrappers~~详解~~ 粗解Tcp wrappers的认识它的基本过程是这样的&#xff1a;iptable攻击和防御DDOS 攻击常见的可能受到 DDOS 攻击体现的症状有&#xff1a;而常见的 DDOS 攻…

C++ 常用算数生成算法

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <vector> using namespace std; #include <algorithm> //不好使 #include <numeric> //好使 #include <iterator> /* accumulate算法 计算容器元素累计总和 param beg 容器开始迭代…

fork()请问下面的程序一共输出多少个“A”?多少个-?

题目&#xff1a;请问下面的程序一共输出多少个“-”&#xff1f; #include #include #include int main(void) { int i; for(i0; i<2; i){ fork(); printf("-"); } return 0; } 解析&#xff1a;一共输出8个。 首先程序一开始&am…