首页 > 编程语言 >C++学习随笔——C++11的array、forward_list、tuple的用法

C++学习随笔——C++11的array、forward_list、tuple的用法

时间:2024-08-30 09:25:15浏览次数:5  
标签:11 std tuple list C++ array include

1. std::array

std::array 是 C++11 引入的一个封装了原生数组的容器,它结合了 C++ 标准库容器的优点和 C 风格数组的效率。

#include <array>
#include <iostream>

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 初始化一个大小为5的数组

    // 访问元素
    for (int i = 0; i < arr.size(); ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    // 使用范围基于 for 循环
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    // 获取数组大小
    std::cout << "Size of array: " << arr.size() << std::endl;

    // 使用at()方法进行边界检查
    try {
        std::cout << arr.at(10) << std::endl; // 这将抛出一个 std::out_of_range 异常
    } catch (const std::out_of_range& e) {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

特点

  • 固定大小std::array 的大小在编译时确定,并且不能动态调整。
  • 性能:相比于 std::vectorstd::array 没有额外的内存分配开销。
  • 安全性:提供了边界检查的 at() 方法,使用时可以避免越界访问。

 

2. std::forward_list

std::forward_list 是一种单向链表,C++11 引入它是为了提供一个轻量级的链表替代方案,适用于只需单向遍历的场景。

#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3, 4, 5};

    // 插入元素到链表前面
    flist.push_front(0);

    // 遍历链表
    for (const auto& elem : flist) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    // 插入元素到指定位置后面
    auto it = flist.begin();
    flist.insert_after(it, 10);

    // 删除元素
    flist.remove(3);

    for (const auto& elem : flist) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

特点

  • 单向链表std::forward_list 只支持单向遍历和单向插入删除操作,相比于 std::list 节省了内存。
  • 内存效率:由于 std::forward_list 只存储前向指针,因此比 std::list 更加节省内存,但也限制了它的操作(无法进行双向遍历)。

 

3. std::tuple

std::tuple (元组)是 C++11 引入的一个通用的数据结构,用于将多个不同类型的值组合在一起。它类似于 std::pair,但可以包含任意数量的元素。

#include <tuple>
#include <iostream>
#include <string>

int main() {
    // 创建一个 tuple
    std::tuple<int, double, std::string> myTuple = std::make_tuple(1, 2.5, "Hello");

    // 获取 tuple 的元素
    std::cout << "First element: " << std::get<0>(myTuple) << std::endl;
    std::cout << "Second element: " << std::get<1>(myTuple) << std::endl;
    std::cout << "Third element: " << std::get<2>(myTuple) << std::endl;

    // 使用 std::tie 解包 tuple
    int a;
    double b;
    std::string c;
    std::tie(a, b, c) = myTuple;

    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;

    // 比较两个 tuple
    std::tuple<int, double, std::string> anotherTuple = std::make_tuple(1, 2.5, "World");
    if (myTuple < anotherTuple) {
        std::cout << "myTuple is less than anotherTuple" << std::endl;
    }

    return 0;
}

特点

  • 多值组合std::tuple 可以组合多个不同类型的值,是 std::pair 的扩展。
  • 解包功能:可以使用 std::tie 或结构化绑定(C++17 引入)来解包 tuple 的值。
  • 比较运算符std::tuple 支持比较运算符,可以直接比较两个 tuple 的大小。

标签:11,std,tuple,list,C++,array,include
From: https://www.cnblogs.com/kitanoki/p/18388001

相关文章

  • C++学习随笔——委托构造函数
    C++11中,引入了委托构造函数(delegatingconstructors)的概念。委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以减少代码重复。 委托构造函数的语法:classMyClass{public:MyClass(intx):value(x){//这个构造函数初始化value}M......
  • 【C++】vector(下)--上篇
    个人主页~vector(上)~vector二、vector的模拟实现1、了解组成2、vector.h(1)为什么有了size_t参数的vector构造函数还要再写一个int参数的重载vector构造函数(2)为什么reserve不用memcpy(3)reserve和resize的相关解释(4)迭代器失效问题详解二、vector的模拟实现1、了解组......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • Java学习笔记11-流程控制语句结构
    一.顺序结构顺序结构顺序结构是最简单的流程控制结构,它按照代码书写的顺序依次执行每一条语句。例如:inta=1,b=2,c=3;System.out.println("a+b="+(a+b));System.out.println("b*c="+(b*c));二.分支结构if分支判断(1).单if条件判断if(条件,条件的......
  • 《C++模板元编程:编程世界的魔法艺术》
    在C++的广阔编程领域中,模板元编程犹如一种神秘而强大的魔法艺术,为开发者打开了一扇通往极致性能与高度灵活性的大门。那么,究竟什么是模板元编程?又该如何在C++中进行模板元编程呢?首先,让我们来理解一下模板元编程的概念。模板元编程是一种在编译期进行计算和代码生成的技术......
  • Vue3的学习---11
    11.Vue组合式API11.1为什么要使用CompositionAPI11.1.1一个OptionsAPI实例在前面都是采用OptionsAPI(基于选项的API)来些一个组件,下面是一个实例<template>num:{{num}}<br>double:{{double}}<button@click="add">加</button></template><scri......
  • msvcr110.dll丢失的解决方法及全面指南
    MSVCR110.dll是MicrosoftVisualC++RedistributablePackage的一部分,对于运行许多基于Windows的应用程序至关重要。当系统报告此文件丢失时,可能导致各种程序无法正常启动。本文将详细介绍几种有效解决MSVCR110.dll丢失问题的方法,并分析各方法的优缺点,帮助用户快速恢复系统正......
  • CMake构建学习笔记11-minizip库的构建
    准确来说,minizip其实是zlib提供的辅助工具,位于zlib库的contrib文件夹内。minizip提供了更为高级一点的接口,能直接操作文件进行压缩。不过,有点麻烦的是这个工具并没有提供CMake构建的方式。那么可以按照构建giflib的方式,自己组织CMakeList.txt,正好这个项目的代码量并不多。另一个......
  • c++偶现问题备录
    目录C++偶现问题备录1.偶现问题源码2.问题根因分析3.修复问题源码C++偶现问题备录1.偶现问题源码源码示例如下:classKZNCalculationException:publicstd::exception{public:#ifdefKZN_LINUXKZNCalculationException(GStringAMsg,GStringAHit):st......
  • Qt | Qt是C++最好的图形界面开发库(学习路线图)
    点击上方"蓝字"关注我们01、WhatisQt?>>>Qt是一个跨平台的C++图形用户界面库,目前包括QtCreator、QtDesigner等等快速开发工具。Qt支持所有Linux/Unix系统,还支持windows平台。Qt很容易扩展,并且允许真正地组件编程。Qt与GTK、MFC、OWL、ATL 是一样的图形界......