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

news2024/11/23 22:37:40

定义于头文件 <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>::assign

void assign( size_type count, const T& value );

(1)(C++11 起)

template< class InputIt >
void assign( InputIt first, InputIt last );

(2)(C++11 起)

void assign( std::initializer_list<T> ilist );

(3)(C++11 起)

 替换容器的内容。

1) 以 countvalue 的副本替换内容。

2) 以范围 [first, last) 中元素的副本替换内容。若任一参数是指向 *this 中的迭代器则行为未定义。

InputIt 为整数类型,则此重载与 (1) 拥有相同效果。

(C++11 前)

此重载仅若 InputIt 满足遗留输入迭代器 (LegacyInputIterator) 才参与重载决议。

(C++11 起)

3) 以来自 initializer_list ilist 的元素替换内容。

所有指向容器元素的迭代器、指针及引用均被非法化。

参数

count-容器的新大小
value-用以初始化容器元素的值
first, last-复制来源元素的范围
ilist-复制值来源的 initializer_list

复杂度

1) 与 count 成线性

2) 与 firstlast 间的距离成线性

3) 与 ilist.size() 成线性

调用示例

#include <iostream>
#include <forward_list>
#include <string>
#include <iterator>
#include <algorithm>

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::forward_list<Cell> forward_list1;
    //1) 以 count 份 value 的副本替换内容。
    forward_list1.assign(6, Cell{101, 101});
    std::cout << "forward_list1:    ";
    std::copy(forward_list1.begin(), forward_list1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    std::forward_list<Cell> forward_list2;
    //2) 以范围 [first, last) 中元素的副本替换内容。
    forward_list2.assign(forward_list1.begin(), forward_list1.end());
    std::cout << "forward_list2:    ";
    std::copy(forward_list2.begin(), forward_list2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    std::forward_list<Cell> forward_list3;
    //3) 以来自 initializer_list ilist 的元素替换内容。
    forward_list3.assign({Cell{101, 101}, Cell{102, 102}, Cell{103, 103}, Cell{104, 104}, Cell{105, 105}});
    std::cout << "forward_list3:    ";
    std::copy(forward_list3.begin(), forward_list3.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    return 0;
}

输出

元素访问

访问第一个元素

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

reference front();

(C++11 起)

const_reference front() const;

(C++11 起)

返回到容器首元素的引用。

在空容器上对 front 的调用是未定义的。

参数

(无)

返回值

到首元素的引用

复杂度

常数

注意

对于容器 c ,表达式 c.front() 等价于 *c.begin() 。

调用示例

#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(6);
    std::generate(forward_list1.begin(), forward_list1.end(), 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 front:  " << forward_list1.front() << std::endl;

    return 0;
}

输出

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

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

相关文章

软件测试:缺陷管理制度

缺陷管理制度 编制部门&#xff1a; 时间&#xff1a;编 制 人&#xff1a; 时间&#xff1a;标 准 化&#xff1a; 时间&#xff1a;审 核&#xff1a; 时间&#xff1a;批 准&#xff1a; …

(一)STM32L4(RT- Thread)——电机和蜂鸣器,独立按键,LED灯

&#xff08;一&#xff09;STM32L4&#xff08;RT- Thread&#xff09;——电机和蜂鸣器&#xff0c;独立按键&#xff0c;LED灯 文章目录&#xff08;一&#xff09;STM32L4&#xff08;RT- Thread&#xff09;——电机和蜂鸣器&#xff0c;独立按键&#xff0c;LED灯LED灯学…

5.8.2、TCP 的连接释放

1、释放流程图 释放流程图 2、TCP 使用 “四报文挥手” 释放连接的具体过程 TCP 通过 “四报文挥手” 来释放连接 数据传输结束后&#xff0c;TCP 通信双方都可以释放连接 现在 TCP 客户进程和 TCP 服务器进程都处于连接已建立状态\color{blue}连接已建立状态连接已建立状态…

k8s 文件 目录挂载

k8s 文件 目录挂载1.环境说明2.HostPath 挂载至宿主机3.挂载至nfs3.1 第一种3.2 第二种3.3 volumeClaimTemplates 挂载模板4.emptyDir-临时数据卷5.未完待续1.环境说明 k8s 1.24.3 2.HostPath 挂载至宿主机 apiVersion: v1 kind: Pod metadata:name: test-pd spec:container…

【Git 从入门到精通】Git是干什么的?

文章目录一、Git简介1.发展历史2.工作机制分析3.代码托管中心二、理解版本控制1.什么是版本控制&#xff1f;2.版本控制的好处3.版本控制的手段①集中式版本控制工具②分布式版本控制工具一、Git简介 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处…

Spool Print Fool(CVE-2022-21999 )提权漏洞

Spool Print Fool&#xff08;CVE-2022-21999 &#xff09;提权漏洞 文章目录 一、Print Spooler 简介二、漏洞简介三、影响版本四、本地复现五、漏洞修复 一、Print Spooler 简介 Print Spooler是打印后台处理服务&#xff0c;即管理所有本地和⽹络打印队列及控制所有打印⼯作…

Scala 模式匹配

文章目录Scala 模式匹配一、模式匹配1、基本语法2、语法说明3、案例示例二、模式守卫三、模式匹配类型1、匹配常量2、匹配类型3、匹配数组Scala 模式匹配 一、模式匹配 Scala 中的模式匹配类似于Java中的switch语法&#xff0c;但是scala 从语法中补充了更多的功能&#xff0…

Optional更优雅的判空

我们在日常的开发工作最经常碰到的异常就是空指针异常&#xff0c;排查起来非常麻烦影响开发效率。如果想避免这种问题&#xff0c;就要写大量的if(xx ! null){}这样的冗余代码&#xff0c;把自己的逻辑写入到括号内部&#xff0c;这样的代码看起来臃肿繁琐。JDK8中为我们提供了…

IP 分支组网解决方案

IP 分支机构组网解决方案在总部部署高性能设备作为中心网关&#xff0c;在各地分支机构分别部署一台产品作为分支机构接入网关&#xff0c;与总部网关进行加密的连接。融合多种产品特性&#xff0c;可有效、快速、安全的实现分支机构的远程接入。同时&#xff0c;采用集中管控平…

对象,类与面向对象编程 上

目录 前言 理解对象 属性的类型 数据属性【Data Properties】 访问器属性【Accessor Properties】 合并对象 对象标识及相等判定 增强的对象语法 1. 属性值简写 2.可计算属性 3.简写方法名 4.对象解构 5.嵌套解构 创建对象 工厂模式 构造函数模式 原型模式 原型…

【敲敲云】零代码平台快速入门指南—上篇

本文通过快速搭建一个《客户管理》应用&#xff0c;帮您快速掌握搭建敲敲云应用的基本思路和操作。 一、敲敲云简介 敲敲云是一个APaaS平台,零代码的应用搭建平台,无需编程简单易学,可以帮助业务人员在不写代码的情况下搭建个性化的CRM、ERP、OA等。敲敲云支持自动化工作流还可…

GIOU 附图说明

在目标检测中&#xff0c;常用IOU评价检测框和ground truth框的相似程度&#xff0c; IOU intersection / union. IOU的取值范围是[0,1]. 但是看下面这两种情况&#xff0c;两个目标框的距离是不一样的&#xff0c;这时它们的IOU都是0&#xff0c;反映不出来。 这时就可以用到…

【JavaGuide面试总结】Linux篇

【JavaGuide面试总结】Linux篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)&#xff0c;块(block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是 4kb&#xff0c;约为 8 个连续的扇区…

Linux系统编程——共享内存映射(进程间通信)

目录mmap函数1.函数原型2.建立映射区3.注意事项4.父子进程间mmap通信4.无血缘关系进程间mmap通信写进程&#xff1a;读进程&#xff1a;附&#xff1a;文件用于进程间通信mmap函数 1.函数原型 void *mmap(void *addr&#xff0c;size_t length, int prot,int flags&#xff0…

代码随想录训练营第五十六天

1.两个字符串的删除操作 题583 ①dp数组含义 由于有两个数组比较&#xff0c;所以用二维数组dp。dp[i] [j]表示以i-1为结尾的word1和以j-1为结尾的word2达到相等需要删除的元素的个数。 ②递推公式 两种情况&#xff0c;当word[i-1] word2[j-1]时&#xff0c;有没有i-1为结…

【Linux】gcc编译器的使用(程序的翻译过程)

目  录1 程序的翻译1.1预处理&#xff08;进行宏替换&#xff09;1.2 编译&#xff08;生成汇编代码&#xff09;1.3 汇编&#xff08;生成机器可识别代码&#xff09;1.4 链接&#xff08;生成可执行文件或者库文件&#xff09;1.5 gcc常用选项总结程序的翻译过程包括&#…

Diffie-Hellman密钥协商算法探究

作者 | 魔王赵二狗 导读 隐私计算&#xff08;Privacy-preserving computation&#xff09;是指在保证数据提供方不泄露原始数据的前提下&#xff0c;对数据进行分析计算的一系列信息技术&#xff0c;保障数据在流通与融合过程中的可用不可见。而Diffie–Hellman密钥协商是一种…

2023-01-10 mysql列存储引擎-聚合多线程并行扫表-VCPackGuardian策略LOCK_ALL-概要设计

摘要: 当前的pack淘汰策略为LOCK_ONE, 在多线程切换时导致pack地址丢失。 新设计LOCK_ALL策略以保证多线程聚合正常工作。 设计思想: 多线程聚合运算期间, 对持有的pack不做淘汰业务中对pack的读取和释放保持原有逻辑架构设计: 静态结构: 动态结构: 上层业务通过VirtualCol…

【学习笔记之Linux】工具之vim基本介绍

vim基本认识 vim是一种多模式的编辑器&#xff0c;它是vi的升级版本&#xff0c;它兼容vi所有的指令并加入了一些新的特性在里面。vi是一个老式的文本编辑器&#xff0c;功能相当齐全&#xff0c;vim则是在vi之上更进了一步&#xff0c;拥有代码补全、编译及错误跳转等功能&…

pytorch OutOfMemoryError

torch.cuda.OutOfMemoryError before: self.memory deque(maxlen50000) after: self.memory deque(maxlen500) ok.... pytorch模型提示超出内存cuda runtime error(2): out of memory - pytorch中文网 看到这个提示&#xff0c;表示您的GPU内存不足。由于我们经常在PyTo…