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

news2025/1/18 10:52:15

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

iterator insert_after( const_iterator pos, const T& value );

(1)(C++11 起)

iterator insert_after( const_iterator pos, T&& value );

(2)(C++11 起)

iterator insert_after( const_iterator pos, size_type count, const T& value );

(3)(C++11 起)

template< class InputIt >
iterator insert_after( const_iterator pos, InputIt first, InputIt last );

(4)(C++11 起)

iterator insert_after( const_iterator pos, std::initializer_list<T> ilist );

(5)(C++11 起)

在容器中的指定位置后插入元素。

1-2) 在 pos 所指向的元素后插入 value

3) 在 pos 所指向的元素后插入 valuecount 个副本

4) 在 pos 所指向的元素后插入来自范围 [first, last) 的元素。 若 firstlast 是指向 *this 中的迭代器则行为未定义。

5) 插入来自 initializer_list ilist 的元素。

没有引用和迭代器被非法化。

参数

pos-内容将插入到其后的迭代器
value-要插入的元素值
count-要插入的副本数
first, last-要插入的元素范围
ilist-插入值来源的 initializer_list
类型要求
- InputIt 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。

返回值

1-2) 指向被插入元素的迭代器。、

3) 指向最后被插入元素的迭代器,或若 count==0 则为 pos

4) 指向最后被插入元素的迭代器,或若 first==last 则为 pos

5) 指向最后被插入元素的迭代器,或若 ilist 为空则为 pos

异常

若在 insert_after 期间抛出异常,则无效果(强异常保证)。

复杂度

1-2) 常数。

3) 与 count 成线性

4) 与 std::distance(first, last) 成线性

5) 与 ilist.size() 成线性

 

调用示例

#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;
    //1-2) 在 pos 所指向的元素后插入 value
    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;

    Cell cell{103, 103};
    //移动语义
    forward_list1.insert_after(forward_list1.begin(), std::move(cell));
    std::cout << "forward_list1:    ";
    std::copy(forward_list1.begin(), forward_list1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    //3) 在 pos 所指向的元素后插入 value 的 count 个副本
    forward_list1.insert_after(forward_list1.begin(), 2, generate());
    std::cout << "forward_list1:    ";
    std::copy(forward_list1.begin(), forward_list1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;


    std::forward_list<Cell> forward_list2;
    //4) 在 pos 所指向的元素后插入来自范围 [first, last) 的元素。
    forward_list2.insert_after(forward_list2.before_begin(), 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;

    //5) 插入来自 initializer_list ilist 的元素。
    std::forward_list<Cell> forward_list3;
    forward_list3.insert_after(forward_list3.before_begin(), {Cell{101, 101}, Cell{102, 102}, Cell{103, 103}});
    std::cout << "forward_list3:    ";
    std::copy(forward_list3.begin(), forward_list3.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    return 0;
}

输出

 

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

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

相关文章

分享57个Python源码,总有一款适合您

Python源码 分享57个Python源码&#xff0c;总有一款适合您 57个Python源码下载链接&#xff1a;https://pan.baidu.com/s/1YZcrJAYFFy3OrdEN5IxnQQ?pwd6666 提取码&#xff1a;6666 采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 下面是文件的名字&#xff0c;我放…

Cadence Allegro 全局布线GRE规划应用及参数设置

GRE是Global Route Environment的缩写,中文意思为全局布线环境,运用具备阶层化意识的全面绕线引擎与图形式互连流程规划程序。通GRE技术在短时间就可以开发出包含众多互连总线与芯片引脚数的复杂且高速的设计组件。此外,运用GRE技术后便于工程师实现更佳的功能密度与系统效能…

ZYNQ-IP核封装笔记

step1&#xff1a;新建文件 将源码放进src中 step2&#xff1a;新建IP location&#xff08;可以多次使用&#xff0c;下次无需创建&#xff09; 点击“ Finish”之后&#xff0c; Vivado 会新建一个名为“ Manage IP”的工程&#xff0c; IP_produce就是我管理IP核的一个空…

【高级Java开发】类QQ聊天工具的设计与实现(代码已上传)

1、要求类QQ聊天工具的设计与实现&#xff0c;要求如下&#xff1a;用户可注册并通过密码录登。用户可通过查找添加自己的好友。用户可通过好友列表选择好友并与之对话。需实现聊天记录查看功能。界面美观大方&#xff0c;交互设计尽量参考QQ。代码结构合理&#xff0c;可复用性…

openGauss2.0.0之Java简单测试Sequence

openGauss2.0.0之Java测试Sequence一、实验环境二、实验目标二、实验步骤一、实验环境 项目Value操作系统openEuler服务器华为云弹性云服务器ECS 1 台 2核心 4GB内存数据库openGauss2.0.0 单机部署 二、实验目标 目标 学习openGauss2.0.0的序列的使用&#xff0c;熟悉JDBC编程方…

(10)QWidget的使用(one)

目录 QWidget的大小和位置 获取QWidget的大小和位置 设置QWidget的大小和位置 设置窗口固定大小 限定窗口的大小 坐标系统转换 内容边距 鼠标指针 鼠标指针的形状 自定义光标的使用 获取和设置光标的坐标 QWidget类是所有可视控件的基类&#xff0c;控件是用户界面…

【C进阶】内存函数

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析课程&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 客官&#xff0c;码字不易&#xff0c;来个三连支持一下吧&#xff01;&#xff01;&#xff01;关注…

Spring知识点记录

Spring知识点1. Spring简介&#xff08;此章略过&#xff09;1.1 Spring概述1.2 Spring家族1.3 Spring Framework2. IOC2.1 IOC容器2.2 基于XML管理bean2.2.1 入门案例&#xff08;ioc容器的整体思路&#xff09;2.2.2 获取bean的三种方式2.2.3 依赖注入2.2.3.1 setter注入2.2.…

指针数组与数组指针---傻傻分不清楚?

目录1.指针数组2.数组指针1.指针数组 什么是指针数组呢&#xff1f; 我们通过以前学过的数组进行类比&#xff1a; 整形数组是存放整形的数组字符数组是存放字符的数组所以&#xff0c;指针数组是存放指针(地址)的数组 整形数组的书写形式是int arr[10]&#xff0c;字符指针…

uniapp兼容小程序和H5遇见的坑

目录 一、报错 vue service.requestcomponentinfo:typeerror:cannot read property matches undefined H5不兼容uni-app的image标签 小程序externalClasses不兼容h5 H5不兼容van-picker和van-datetime-picker 一、报错 vue service.requestcomponentinfo:typeerror:cannot r…

【C语言进阶】 一篇带你掌握字符串和内存函数

目录一&#xff1a;strlen模拟实现&#xff1a;二&#xff1a;strcpy模拟实现&#xff1a;三&#xff1a;strcat模拟实现&#xff1a;四&#xff1a;strcmp模拟实现&#xff1a;五&#xff1a;strncpy模拟实现&#xff1a;六&#xff1a;strncat模拟实现&#xff1a;七&#xf…

如何正确地连接PLC与7种设备的输入输出线路

正确地连接输入和输出线路&#xff0c;是保证PLC可靠工作的前提。想要正确地连接PLC与7种设备的输入输出线路&#xff0c;就需注意以下几个方面&#xff1a;1.PLC与主令电器类设备的连接下图是PLC与按钮、行程开关、转换开关等主令电器类输入设备的接线示意图。图中的PLC为直流…

3、运算符

目录 一、算数运算符 二、关系运算符 三、逻辑运算符 一、算数运算符 MATLAB中的算术运算符有加、减、乘、除、点乘、点除等&#xff0c;其运算法则表&#xff1a; 示例1&#xff1a;数值与矩阵的算术运算 Aeye(2)Bones(2)CA*BDA.*B 运行结果&#xff1a; 此外&#xff0…

25.数组指针取*,指针和函数的关系,指针作为函数的参数

数组指针取* 数组指针取*&#xff0c;并不是取值的意思&#xff0c;而是指针的类型发生变化&#xff1b; 一维数组指针取*&#xff0c;结果为它指向的一维数组第0个元素的地址&#xff0c;它们还是指向同一个地方。二维数组指针取*&#xff0c;结果为一维数组指针&#xff0c…

Excel实战 第1章 数据处理

目录1 数据规范2. 导入数据3. 数据清洗3.1 重复数据处理3.2 缺失数据处理3.3 空格数据处理1 数据规范 2. 导入数据 3. 数据清洗 3.1 重复数据处理 数据透视表法&#xff08;首选&#xff09; 选中A、B两列&#xff0c;点击【插入】–》【数据透视表】 把号码拉到【行】&…

LeetCode 207. 课程表

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 207. 课程表&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 207. …

图表控件LightningChart.NET 系列教程(六):许可证管理介绍(下)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

Docker面试题(史上最全 + 持续更新)

专题37&#xff1a;Docker面试题&#xff08;史上最全、定期更新&#xff09; 本文版本说明&#xff1a;V26 《尼恩面试宝典》升级的规划为&#xff1a; 后续基本上&#xff0c;每一个月&#xff0c;都会发布一次&#xff0c;最新版本&#xff0c;可以联系构师尼恩获取&…

VALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers

文章目录NLP中Bert的进展历史word embeddingELMOGPTBertAudioLM: a Language Modeling Approach to Audio Generationabstractintrorelated workVALL-E:Neural Codec Language Models are Zero-Shot Text to Speech Synthesizersabstractspeech quantizationtraining:condition…

程序的机器级表示part2——访问信息

目录 1. 整数寄存器 2. 操作数指示符与寻址模式 3. 数据传送指令 4. 压入和弹出栈数据 1. 整数寄存器 一个x86-64的CPU包含一组16个存储64位值的通用目的寄存器(general-purpose registers) 整型寄存器x86-64的CPU是64位的&#xff0c;因此相应的寄存器长度与机器字长(数据…