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

news2024/11/17 2:28:22

定义于头文件 <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) 的要求。
 

成员函数

构造 forward_list

forward_list();

(1)

explicit forward_list( const Allocator& alloc );

(2)
forward_list( size_type count,

              const T& value,

              const Allocator& alloc = Allocator());
(3)(C++11 起)

explicit forward_list( size_type count );

(4)(C++11 起)
(C++14 前)

explicit forward_list( size_type count, const Allocator& alloc = Allocator() );

(C++14 起)
template< class InputIt >

forward_list( InputIt first, InputIt last,

              const Allocator& alloc = Allocator() );
(5)(C++11 起)

forward_list( const forward_list& other );

(6)(C++11 起)

forward_list( const forward_list& other, const Allocator& alloc );

(6)(C++11 起)

forward_list( forward_list&& other );

(7)(C++11 起)

forward_list( forward_list&& other, const Allocator& alloc );

(8)(C++11 起)

forward_list( std::initializer_list<T> init,
              const Allocator& alloc = Allocator() );

(9)(C++11 起)

从各种数据源构造新容器,可选地使用用户提供的分配器 alloc

1) 默认构造函数。构造拥有默认构造的分配器的空容器。

2) 构造拥有给定分配器 alloc 的空容器。

3) 构造拥有 count 个有值 value 的元素的容器。

4) 构造拥有个 count 默认插入的 T 实例的容器。不进行复制。

5) 构造拥有范围 [first, last) 内容的容器。

InputIt 是整数类型,则此构造函数拥有的效果同 forward_list(static_cast<size_type>(first), static_cast<value_type>(last), a) 。

(C++11 前)

此重载仅若InputIt 满足遗留输入迭代器 (LegacyInputIterator) 才参与重载决议,以避免和重载 (2) 的歧义。

(C++11 起)

6) 复制构造函数。构造拥有 other 内容的容器。若不提供 alloc ,则如同通过调用 std::allocator_traits<allocator_type>::select_on_container_copy_construction(other.get_allocator()) 获得分配器。

7) 移动构造函数。用移动语义构造拥有 other 内容的容器。分配器通过属于 other 的分配器移动构造获得。

8) 有分配器扩展的移动构造函数。以 alloc 为新容器的分配器,从 other 移动内容;若 alloc != other.get_allocator() ,则它导致逐元素移动。

9) 构造拥有 initializer_list init 内容的容器。

参数

alloc-用于此容器所有内存分配的分配器
count-容器的大小
value-以之初始化容器元素的值
first, last-复制元素的来源范围
other-用作初始化容器元素来源的另一容器
init-用作初始化元素来源的 initializer_list

复杂度

1-2) 常数

3-4) 与 count 成线性

5) 与 firstlast 的距离成线性

6) 与 other 的大小成线性

7) 常数。

8) 若 alloc != other.get_allocator() 则为线性,否则为常数。

9) 与 init 的大小成线性。

异常

Allocator::allocate 的调用可能抛出。

注意

在容器移动构造(重载 (7) )后,指向 other 的引用及迭代器(除了尾迭代器)保持合法,但指代现于 *this 中的元素。当前标准由 [container.requirements.general]/12 中的总括陈述作出此保证,而 LWG 2321 正在考虑更严格的保证。 

析构 forward_list

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

~forward_list();

(C++11 起)

销毁容器。调用元素的析构函数,然后解分配所用的存储。注意,若元素是指针,则不销毁所指向的对象。

复杂度

与容器大小成线性。

 

调用示例

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

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;

    //1) 默认构造函数。构造拥有默认构造的分配器的空容器。
    std::forward_list<Cell> forward_list1;
    std::cout << "forward_list1 empty: " << forward_list1.empty() << std::endl;
    std::cout << std::endl;

    //3) 构造拥有 count 个有值 value 的元素的容器。
    std::forward_list<Cell> forward_list2(5, Cell{101, 101});
    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;

    //4) 构造拥有个 count 默认插入的 T 实例的容器。不进行复制。
    std::forward_list<Cell> forward_list3(5);
    std::cout << "forward_list3:    ";
    std::copy(forward_list3.begin(), forward_list3.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    //5) 构造拥有范围 [first, last) 内容的容器。
    std::forward_list<Cell> forward_list4(forward_list2.begin(), forward_list2.end());
    std::cout << "forward_list4:    ";
    std::copy(forward_list4.begin(), forward_list4.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    //6) 复制构造函数。构造拥有 other 内容的容器。
    std::forward_list<Cell> forward_list5(forward_list2);
    std::cout << "forward_list5:    ";
    std::copy(forward_list5.begin(), forward_list5.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    //7) 移动构造函数。用移动语义构造拥有 other 内容的容器。
    std::forward_list<Cell> forward_list6(std::move(forward_list2));
    std::cout << "forward_list2:    ";
    std::copy(forward_list2.begin(), forward_list2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << "forward_list6:    ";
    std::copy(forward_list6.begin(), forward_list6.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    //9) 构造拥有 initializer_list init 内容的容器。
    std::forward_list<Cell> forward_list7({Cell{101, 101}, Cell{102, 102},
                                           Cell{103, 103}, Cell{104, 104}, Cell{105, 105}});
    std::cout << "forward_list7:    ";
    std::copy(forward_list7.begin(), forward_list7.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}

输出

 

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

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

相关文章

什么是数字孪生城市

数字孪生城市理念自提出以来不断升温&#xff0c;已成为新型智慧城市建设的热点&#xff0c;受到政府和产业 界的高度关注和认同。 什么是数字孪生城市 北京智汇云舟科技有限公司成立于2012年&#xff0c;专注于创新性的“视频孪生&#xff08;实时实景数字孪生&#xff09;”…

【Java编程进阶】Java抽象类与接口详解

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】&#xff0c;从入门到就业精通&#xff0c;买不了吃亏&#xff0c;买不了上当&#xff01;&#xff01; 文章目录1. 抽象类2.接口3. 抽象类和接口对比4. 总结Java基础教程系列文章1. 抽象类 前面说到&#xff0c;Ja…

【营销获客三】信贷细分客群研究——小微企业主

【营销获客三】信贷细分客群研究——小微企业主一、小微企业主客群综述1.1 小微企业主定义与体量1.2 小微企业主信贷需求规模1.3 小微企业主的发展历史1.4 小微企业主不同阶段的痛点问题二、小微企业主整体客群特征2.1 客群特征概述2.2 基本属性特征2.3 经营情况特征2.4 融资借…

RTL8380M/RTL8382M管理型交换机系统软件操作指南五:ACL/访问控制列表

接下来将对ACL进行详细的描述&#xff0c;主要包括以下四个方面内容&#xff1a;ACL概述、工作原理、ACL组设置、ACL规则 1.1 ACL概述 访问控制列表&#xff08;Access Control List&#xff0c;ACL&#xff09; 是路由器和交换机接口的指令列表&#xff0c;用来控制端口进出的…

自连接讲解

什么是自连接&#xff1f; 自连接可以理解为自己连接自己&#xff0c;在一张表上面所进行的操作&#xff1b;将一张表分成两张结构和数据完全一样的表&#xff0c;相当于克隆了一张跟自己长得一模一样的表&#xff1b; 但是既然是两张一模一样的表&#xff0c;数据库怎么去区分…

[ 数据结构 ] 汉诺塔--------分治算法最佳实践

0 分治算法 分治法:是一种很重要的算法。字面上的解释是“分而治之”&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并。经典问题:…

什么你还不知道?快来看看我的年度总结吧

作者介绍&#xff1a;阿玥的小东东 作者职位&#xff1a;后端、python、正在学习c 主页&#xff1a;阿玥的小东东 现在呢&#xff0c;人们都在写自己的年度总结&#xff0c;我也来凑个热闹吧&#xff01; 其实我来CSDN这个平台时间不算久&#xff0c;从2022年11月15号开始&…

<C++>set和map

文章目录1. 关联式容器2. 键值对3. 树形结构的关联式容器4. set4.1 set的介绍4.2 set的使用4.2.1 set的模板参数4.2.2 set的构造4.2.3 set的迭代器4.2.4 set的容量4.2.5 set修改操作4.2.6 set的使用举例5. multiset5.1 multiset的介绍5.2 multiset的使用6. map6.1 map的介绍6.2…

字符串相关类

文章目录一、String类String的介绍String实例化面试题&#xff1a;String snew String("abc")创建对象&#xff0c;在内存中创建了几个对象&#xff1f;易错题1易错题2String常用方法String与char[ ]之间的转换String与byte[ ]之间的转换二、StringBuffer类、StringB…

如何将NACOS作为配置中心

新建一个命名空间 点击创建配置 关键点1&#xff1a;Data ID的命名规则&#xff1a; 前面我们演示了在 nacos 控制台新建一个 DataID 为 cloud-producer-server-dev.yaml 的数据集&#xff0c;那么这个 Data ID 是什么呢&#xff1f;Data ID 是配置集的唯一标识&#xff0c;一个…

CSS初级教程(字体)【第七天】

文章目录【1】CSS 字体【2】CSS 字体样式【3】CSS 字体大小【4】CSS 谷歌字体【5】CSS 字体属性【6】所有 CSS 字体属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CSS初级教程 边距、高度、宽度【第四天】 CSS初级教…

ChatGPT的注册和使用教程

1 简介在时下热门话题AI作画之外&#xff0c;最近一个名叫ChatGPT的聊天机器人又掀起了一股人工智能的热潮。已有无数人投入到对它的测试研究之中&#xff0c;想探清它到底无所不能到何种地步。据悉&#xff0c;已有超过百万人与机器人聊天&#xff0c;甚至导致网站一度崩溃。那…

URDF与RVIZ

#来自赵虚左的资料&#xff0c;视频 创建功能包urdf01_rviz&#xff0c;依赖rviz xacro(比较简单使用) <launch> <!-- 设置参数 --> <param name"robot_description" textfile"$(find urdf01_rviz)/urdf/urdf/demo01_helloworld.urdf"…

Docker软件安装文档

软件安装文档 文章目录软件安装文档虚拟机安装系统死锁问题JDK11安装Docker安装Docker-Compose安装MySQL安装MySQL8安装Docker-Compose安装MySQL8MySQL5.7安装Nacos安装Docker安装Nacos单机Docker-Compose安装Nacos集群OpenResty安装Redis安装Docker安装单机RedisDocker-Compos…

【Unity3D】点选物体、框选物体、绘制外边框

1 需求描述 点选物体&#xff1a;点击物体&#xff0c;可以选中物体&#xff0c;按住 Ctrl 追加选中&#xff0c;选中的物体设置为红色。框选物体&#xff1a;拖拽鼠标&#xff0c;屏幕上会出现滑动框&#xff0c;滑动框内的物体会被选中&#xff0c;选中的物体设置为红色。绘…

Vue中自定义指令是什么?有哪些应用场景?

一、什么是指令 开始之前先学习一下指令系统这个词 指令系统是计算机硬件的语言系统&#xff0c;也叫机器语言&#xff0c;它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力 在vue中提供了一套为数据驱动视图更为方便的操作&…

【C语言进阶】qsort函数详解以及它的模拟实现

目录一、qsort函数介绍二、qsort函数参数介绍2.1&#xff1a;void* base2.2&#xff1a;size_t num2.3&#xff1a;size_t size2.4&#xff1a;int(* compar)(const void *,const void *)三、实际应用3.1&#xff1a;利用qsort函数对整型数组排序3.2&#xff1a;利用qsort函数对…

2023年1月9日:fastadmin在列表操作列区域添加按钮及控制已有按钮显示

列表操作列区域添加按钮 buttons: [{name: detail,title: __(详情),classname: btn btn-xs btn-primary btn-dialog,icon: fa fa-list,url: audit/detail,callback: function (data) {Layer.alert("接收到回传数据&#xff1a;" JSON.stringify(data), {title: &q…

【nvivo11plus教程】01_nvivo介绍、案例与批注

1、查看nvivo版本2、nvivo是如何支持质性研究的3、nvivo的项目介绍4、建立nvivo项目(1)建立项目(2)文件夹(3)新建分类(4)建立备忘录5、案例(1)建立案例(2)案例节点分类的变量设置(3)归类案例6、批注7、备忘录链接1、查看nvivo版本 2、nvivo是如何支持质性研究的 是一个迭代的过…

MATLAB算法实战应用案例精讲-【数据分析】时许异常检测

前言 时间序列异常检测的目的就是在时间序列中寻找不符合常见规律的异常点,无论是在学术界还是工业界这都是一个非常重要的问题。企业的运维场景中有海量的运维指标数据,如果单纯依靠人力来发现并定位异常,将是十分低效的,所以如果可以开发一个智能运维系统对于异常波动自…