c++11 标准模板(STL)(std::forward_list)(六)

news2024/10/6 5:59:53

定义于头文件 <forward_list>

template<

    class T,
    class Allocator = std::allocator<T>

> class forward_list;
(1)(C++11 起)
namespace pmr {

    template <class T>
    using forward_list = std::forward_list<T, std::pmr::polymorphic_allocator<T>>;

}
(2)(C++17 起)

std::forward_list 是支持从容器中的任何位置快速插入和移除元素的容器。不支持快速随机访问。它实现为单链表,且实质上与其在 C 中实现相比无任何开销。与 std::list 相比,此容器提在不需要双向迭代时提供更有效地利用空间的存储。

在链表内或跨数个链表添加、移除和移动元素,不会非法化当前指代链表中其他元素的迭代器。然而,在从链表移除元素(通过 erase_after )时,指代对应元素的迭代器或引用会被非法化。

std::forward_list 满足容器 (Container) (除了 operator== 的复杂度始终为线性和 size 函数)、具分配器容器 (AllocatorAwareContainer) 和序列容器 (SequenceContainer) 的要求。
 

容量

检查容器是否为空

std::forward_list<T,Allocator>::empty

bool empty() const noexcept;

(C++11 起)
(C++20 前)

[[nodiscard]] bool empty() const noexcept;

(C++20 起)

检查容器是否无元素,即是否 begin() == end() 。

参数

(无)

返回值

若容器为空则为 true ,否则为 false

复杂度

常数。

调用示例

    std::cout << std::boolalpha;

    std::mt19937 g{std::random_device{}()};
    srand((unsigned)time(NULL));;

    auto generate = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    std::forward_list<Cell> forward_list1;
    std::cout << "forward_list1 empty : " << forward_list1.empty() << std::endl;
    for (size_t index = 0; index < 3; index ++)
    {
        forward_list1.insert_after(forward_list1.before_begin(), generate());
    }
    std::cout << "forward_list1:        ";
    std::copy(forward_list1.begin(), forward_list1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << "forward_list1 empty : " << forward_list1.empty() << std::endl;

 

返回可容纳的最大元素数

std::forward_list<T,Allocator>::max_size

size_type max_size() const noexcept;

(C++11 起)

返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end()) 。

参数

(无)

返回值

元素数量的最大值。

复杂度

常数。

注意

此值通常反映容器大小上的理论极限,至多为 std::numeric_limits<difference_type>::max() 。运行时,可用 RAM 总量可能会限制容器大小到小于 max_size() 的值。

 调用示例

    //返回根据系统或库实现限制的容器可保有的元素最大数量
    std::forward_list<Cell> forward_list2;
    std::cout << "Cell max_size:        " << forward_list2.max_size() << std::endl;
    std::forward_list<int> forward_list3;
    std::cout << "int max_size:         " << forward_list3.max_size() << std::endl;
    std::forward_list<std::string> forward_list4;
    std::cout << "string max_size:      " << forward_list4.max_size() << std::endl;
    std::forward_list<double> forward_list5;
    std::cout << "double max_size:      " << forward_list5.max_size() << std::endl;
    std::forward_list<long> forward_list6;
    std::cout << "long max_size:        " << forward_list6.max_size() << std::endl;
    std::forward_list<long long> forward_list7;
    std::cout << "long long max_size:   " << forward_list7.max_size() << std::endl;

调用示例

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>
#include <time.h>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell() = default;
    Cell(int a, int b): x(a), y(b) {}

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator +(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator *(const Cell &cell)
    {
        x *= cell.x;
        y *= cell.y;
        return *this;
    }

    Cell &operator ++()
    {
        x += 1;
        y += 1;
        return *this;
    }

    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }

    bool operator ==(const Cell &cell) const
    {
        return x == cell.x && y == cell.y;
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

int main()
{
    std::cout << std::boolalpha;

    std::mt19937 g{std::random_device{}()};
    srand((unsigned)time(NULL));;

    auto generate = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    std::forward_list<Cell> forward_list1;
    std::cout << "forward_list1 empty : " << forward_list1.empty() << std::endl;
    for (size_t index = 0; index < 3; index ++)
    {
        forward_list1.insert_after(forward_list1.before_begin(), generate());
    }
    std::cout << "forward_list1:        ";
    std::copy(forward_list1.begin(), forward_list1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << "forward_list1 empty : " << forward_list1.empty() << std::endl;
    std::cout << std::endl;

    //返回根据系统或库实现限制的容器可保有的元素最大数量
    std::forward_list<Cell> forward_list2;
    std::cout << "Cell max_size:        " << forward_list2.max_size() << std::endl;
    std::forward_list<int> forward_list3;
    std::cout << "int max_size:         " << forward_list3.max_size() << std::endl;
    std::forward_list<std::string> forward_list4;
    std::cout << "string max_size:      " << forward_list4.max_size() << std::endl;
    std::forward_list<double> forward_list5;
    std::cout << "double max_size:      " << forward_list5.max_size() << std::endl;
    std::forward_list<long> forward_list6;
    std::cout << "long max_size:        " << forward_list6.max_size() << std::endl;
    std::forward_list<long long> forward_list7;
    std::cout << "long long max_size:   " << forward_list7.max_size() << std::endl;

    return 0;
}

输出

 

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

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

相关文章

动态内存管理详解(malloc、calloc、realloc)

文章目录 一、什么是动态内存 二、为什么要存在动态内存分配 三、动态内存函数的介绍 3、1 malloc和free的介绍 3、2 calloc的介绍 3、3 reallco的介绍 四、常见的动态内存错误 4、1 对NULL指针的解引用操作 4、2 对动态开辟空间的越界访问 4、3 对非动态开辟内存使用free释放 …

rcu锁原理以及rcu example学习

rcu参考资料&#xff1a; https://airekans.github.io/c/2016/05/10/dive-into-liburcu https://lwn.net/Articles/262464/ https://cloud.tencent.com/developer/article/1684477 https://www.cnblogs.com/LoyenWang/p/12681494.html userspace rcu: https://github.com/urcu…

PHP 过滤器

PHP 过滤器用于验证和过滤来自非安全来源的数据&#xff0c;比如用户的输入。什么是 PHP 过滤器&#xff1f;PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。PHP 的过滤器扩展的设计目的是使数据过滤…

目标检测、实例分割、旋转框样样精通!详解高性能检测算法 RTMDet

1. 简介 近几年来&#xff0c;目标检测模型&#xff0c;尤其是单阶段目标检测模型在工业场景中已经得到广泛应用。对于检测算法来说&#xff0c;模型的精度以及运行效率是实际使用时最受关注的指标。因此&#xff0c;我们对目前的单阶段目标检测器进行了全面的改进&#xff1a…

超参数、划分数据集、

目录1.超参数(hyperparameters)参数(Parameters)&#xff1a;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;...超参数&#xff1a;能够控制参数W,b的参数&#xff0c;是在开始学习之前设置的参数。比如&#xff1a;学习率、梯度下降循环的数量#iterations、隐…

【阶段三】Python机器学习23篇:机器学习项目实战:XGBoost分类模型

本篇的思维导图: XGBoost算法可以说是集成学习方法中的王牌算法。在著名的数据挖掘比赛平台Kaggle上,众多获胜者都使用了XGBoost算法,它在绝大多数回归问题和分类问题上的表现都十分不错。 XGBoost算法的核心思想 XGBoost算法在某种程度上可以说是GBDT算法…

蓝桥杯:超级质数

目录 题目链接 问题描述 答案提交 本题答案为&#xff1a;373。 思路&#xff1a; 模拟代码(Java)&#xff1a; 问题描述 如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻…

【Node.js实战】一文带你开发博客项目之日志(文件读写、stream流、写日志)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

《码出高效:java开发手册》八 -单元测试

前言 这章内容主要是讲单测&#xff0c;单元就是指一个程序分的最小单位&#xff0c;一般是类或者方法&#xff0c;在面向对象编程里&#xff0c;一般就是认为方法是最小单位&#xff0c;单测是程序功能的基本保障&#xff0c;在软件上线前非常重要的一环 正文 单测的好处&a…

_Linux多线程-死锁Linux线程同步篇

文章目录1. 死锁死锁四个必要条件避免死锁避免死锁算法&#xff08;了解&#xff09;2. Linux线程同步线程同步出现的背景条件变量同步概念与竞态条件条件变量函数1. 初始化2. 销毁3. 等待条件满足4. 唤醒等待小结测试实验1. 死锁 死锁是指在一组进程中的各个进程均占有不会释…

linux服务器CPU飙高排查

文章目录前言一、第一步 top二、根据pid查找具体线程2.根据pid找到16进制3. 根据进程和线程查找原因总结前言 系统cpu飙高,尤其对于后端人员来说,其实应该学会排查,这样也算是综合能力的体现;那么当出现了cpu严重飙高的时候怎么排查呢? 一、第一步 top 直接在问题服务器输入…

如何系统地学习 C++ 语言?

C 最大的缺点就是语法复杂&#xff0c;而且难学难精。 学习 C 语言也许一本 K&R 的《C程序设计语言》就够了&#xff0c;但是在 C 世界里&#xff0c;找不到这样一本书。在这个爱速成的年代&#xff0c;大家可能耐不住寂寞花很长时间去学习一门语言&#xff0c;所以可以看…

车载以太网 - DoIP电源模式 - 07

DoIP电源模式&节点状态&激活检查这3块内容没有太大的逻辑性可言,主要是概念性内容介绍,所以本篇内容可能会略显枯燥,不过我回尽量完整的把这几块内容介绍清晰,为后面的测试用例设计做好铺垫,方便大家在看完文章后,更加快速的提取知识点,并完成测试设计。 诊断电…

回溯法--图的m着色问题--子集树

问题描述 给定无向连通图和m种不同的颜色&#xff0c;用这些颜色为图G的各个顶点着色&#xff0c;每个顶点有一种颜色 是否有一种着色方法&#xff1f;使得图G中每条边的两个顶点有不同的颜色 这个问题就是图的m可着色判定问题 色数&#xff1a;如果有一个图最少需要m种颜色…

C进阶:自定义类型:结构体、枚举、联合体

自定义类型&#xff1a;结构体、枚举、联合体自定义类型&#xff1a;结构体、枚举、联合体结构体结构的定义&#xff1a;结构体的声明&#xff1a;特殊的声明(匿名)结构体的自引用&#xff1a;结构体变量的定义和初始化结构体内存对齐为什么要有内存对齐修改默认对齐数结构体传…

李宏毅ML-自动调整学习速率

自动调整学习速率 文章目录自动调整学习速率1. RMS and Adagrad2. RMSProp and Adam3. Learning rate scheduling3. 总结1. RMS and Adagrad 在下面有两幅图&#xff0c;如第一幅图所示&#xff0c;随着 iteration 的增加&#xff0c;loss 在不断减少&#xff0c;最后趋近于 0…

广告业务系统 之 智能保险丝 —— “智能流控”

文章目录广告业务系统 之 智能保险丝 —— “智能流控”智能流控常规流量调控数据源计算智能流控功能挂载阈值存储架构长短板服务构建及部署广告业务系统 之 智能保险丝 —— “智能流控” 除了 在 AB 环节 设计了出色的 重试机制 —— “ 双发 ” 外&#xff0c;在 ADX 系统的…

【Redis】Redis实现全局唯一ID

【Redis】Redis实现全局唯一ID 为什么要使用Redis实现全局唯一ID去替代传统的数据库自增ID&#xff0c;主要原因如下&#xff1a; 数据库自增ID的规律性太明显受单表数据量的限制&#xff0c;数据量很大时分表会出现ID重复的现象 1. 全局ID生成器 出于以上原因&#xff0c;我…

Vue3——第十三章(插槽 Slots)

一、插槽内容与出口 这里有一个 <FancyButton> 组件&#xff0c;可以像这样使用&#xff1a; 而 <FancyButton> 的模板是这样的&#xff1a; <slot> 元素是一个插槽出口 (slot outlet)&#xff0c;标示了父元素提供的插槽内容 (slot content) 将在哪里被…

excel图表技巧:如何用填充单元格制作比率分析图

在工作中&#xff0c;我们经常要向上级领导汇报某个指标的进度或完成情况。有时候&#xff0c;我们会用仪表盘或温度计图来展示数据。不会这类型图表的朋友&#xff0c;不用担心&#xff0c;因为今天&#xff0c;我将教给大家一种更简单的方法&#xff01;公司新来的职员小明&a…