首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用于在C++ std :: <vector>容器中存储多种类型的结构的模式

在C++中,std::vector是一个动态数组,用于存储相同类型的元素。如果要在std::vector中存储多种类型的数据,可以使用std::variantstd::any

  1. 使用std::variant

std::variant是C++17引入的一种类型安全的联合类型,它可以存储多种类型的数据,但是需要在编译时确定可能的类型。

代码语言:cpp
复制
#include<iostream>
#include<vector>
#include<variant>

int main() {
    std::vector<std::variant<int, double, std::string>> vec;
    vec.push_back(42);
    vec.push_back(3.14);
    vec.push_back("hello");

    for (const auto& item : vec) {
        std::visit([](const auto& value) {
            using T = std::decay_t<decltype(value)>;
            if constexpr (std::is_same_v<T, int>) {
                std::cout << "int: "<< value<< std::endl;
            } else if constexpr (std::is_same_v<T, double>) {
                std::cout << "double: "<< value<< std::endl;
            } else if constexpr (std::is_same_v<T, std::string>) {
                std::cout << "string: "<< value<< std::endl;
            }
        }, item);
    }

    return 0;
}
  1. 使用std::any

std::any是C++17引入的一种类型安全的容器,可以存储任何类型的数据。

代码语言:cpp
复制
#include<iostream>
#include<vector>
#include <any>

int main() {
    std::vector<std::any> vec;
    vec.push_back(42);
    vec.push_back(3.14);
    vec.push_back("hello");

    for (const auto& item : vec) {
        if (item.type() == typeid(int)) {
            std::cout << "int: "<< std::any_cast<int>(item)<< std::endl;
        } else if (item.type() == typeid(double)) {
            std::cout << "double: "<< std::any_cast<double>(item)<< std::endl;
        } else if (item.type() == typeid(std::string)) {
            std::cout << "string: "<< std::any_cast<std::string>(item)<< std::endl;
        }
    }

    return 0;
}

这两种方法都可以实现在std::vector中存储多种类型的数据,但是std::variant更加类型安全,而std::any更加灵活。在选择使用哪种方法时,需要根据具体的需求和场景来决定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++指南】解锁C++ STL:从入门到进阶的技术之旅

比如在数据存储方面,它提供了 vector(动态数组)、list(链表)、map(映射)、set(集合)等多种容器,每种容器都有其独特的特性和适用场景,就像不同类型的工具适用于不同的工作一样。...二、STL 的核心组件 2.1 容器(Containers) 容器是 STL 中用于存储数据的数据结构,就像是一个个不同类型的 “盒子”,可以用来存放各种数据。...STL 算法通过迭代器来访问容器中的元素,从而实现对不同容器的通用操作,这使得算法与容器解耦,同一个算法可以应用于多种容器类型,大大提高了代码的复用性 。...find 算法用于在容器中查找指定的元素,返回指向该元素的迭代器,如果未找到则返回容器的结束迭代器。例如在一个存储学生成绩的 vector 中查找某个特定的成绩,就可以使用 find 算法 。...迭代器有多种类型,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器: 输入迭代器只能向前移动,用于读取容器中的元素; 输出迭代器只能向前移动,用于向容器中写入元素; 前向迭代器可以向前移动

16410

C++标准库:使用STL提供的数据结构和算法

STL提供了丰富的数据结构和算法,帮助更高效地进行编程。介绍STL中一些常用的数据结构和算法,并给出相应的示例代码。1. 容器(Containers)STL提供了多种容器,用于存储和管理数据。...算法(Algorithms)STL还提供了一系列强大的算法,用于处理容器中的数据。常用的算法有:排序算法(Sorting):如sort(),用于对容器中的元素进行排序。...查找算法(Searching):如find(),用于在容器中查找特定的元素。遍历算法(Traversal):如for_each(),用于对容器中的每个元素执行特定的操作。...结论STL提供了丰富的数据结构和算法,大大简化的编程工作。使用STL的容器和算法,更加高效地进行数据存储、操作和处理。熟练掌握STL的使用方法,对于C++编程来说是非常重要的。...在这个示例中,创建了一个Book类来表示每一本图书,然后将图书对象存储在std::vector容器中。

68920
  • C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比

    C++ 中 std::array 与 std::vector 的深入对比 在 C++ 标准库中,std::array 和 std::vector 是两种常用的容器...std::vector 动态数据:适用于数据数量不确定或需要动态调整的场景,如读取用户输入、处理文件中的数据。 频繁操作:当需要频繁添加或删除元素时,std::vector 提供了必要的灵活性。...五、元素存储位置 std::array:对象和数组存储在相同的内存区域(栈)中。 std::vector:对象存储在自由存储区(堆)。...}; // 使用初始化列表 总结 std::array 和 std::vector 在 C++ 中各有其适用场景。...std::array 适用于需要高性能和固定大小的数据存储,而 std::vector 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。

    10710

    c++基础知识

    +中的vector头文件里面有这个push_back函数,在vector类中作用为在vector尾部加入一个数据。  ...游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。...或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。...由于Iterator模式的以上特性:与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类,如STL的list、vector、stack等容器类及ostream_iterator等扩展...size指容器当前拥有的元素个数;而capacity则指容器在必须分配新存储空间之前可以存储的元素总数,也可以说是预分配存储空间的大小。    resize()函数和容器的size息息相关。

    1.2K40

    —— C++ 泛型编程的核心价值

    导读 在 Windows 客户端开发中,我们经常需要处理多种数据类型:从 GUI 控件的泛型容器,到系统 API 的跨类型封装,再到高性能算法的类型抽象。...本章将深入探讨 C++ 模板如何通过泛型编程解决这些问题,并通过 Windows 注册表操作等实战案例,展示模板在真实场景中的强大能力。...二、模板在 Windows 开发中的典型应用 2.1 GUI 框架中的容器 Windows 桌面应用常使用各种控件(按钮、文本框等)。...注册表泛型读取器 4.1 需求分析 我们需要从注册表中读取多种类型的数据: DWORD(32 位整数) SZ(字符串) BINARY(二进制数据) 传统实现需要为每个类型编写独立函数,而模板可以统一接口..... } 六、更进一步:扩展注册表读取器支持二进制数据 6.1 需求分析 在 Windows 注册表中,二进制数据(REG_BINARY)常用于存储加密密钥、序列化对象等。

    19710

    开心档之C++ STL 教程

    C++ STL 教程 在前面的章节中,我们已经学习了 C++ 模板的概念。...C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。...C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。 算法(Algorithms) 算法作用于容器。...下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求: 实例 #include #include...vector> using namespace std; int main() { // 创建一个向量存储 int vector vec; int i;

    46700

    C++の容器vector

    关于容器,我们后面详细介绍,以后我们还会学习很多种类型的容器,大体上分为两类,序列型容器和关联型容器。而我们今天所说的vector即是序列型容器。...所谓序列型就是指vector这个东西存数据的时候按照先后顺序一个一个存,可以把它想象成数据结构中的栈这个概念。...现在我们可以把它理解为用vector创建对象时,是有一个模板的,可以根据传入参数的数据类型创建对象,这也是vector能够存储基本所有内置类型对象和类类型对象的原因。...; //创建一个用于存储vector的vector,前者中又存着string对象 我们需要注意的是,vector并不是像int, string等具体的类型,vector并不是类型,所以不能直接使用:...所以,下面的代码,编译器是会报错的: *(v_int1.cbegin() + 2) = 8; 一般来说,我们在代码中我们不会直接指定迭代器的类型,根据第一篇的C++自动类型推导及其他,我们一般使用auto

    71820

    《C++中动态数组的实现与探索》

    在 C++编程中,动态数组是一种非常重要的数据结构,它能够根据实际需求在运行时动态地调整大小,为程序员提供了极大的灵活性。...本文将深入探讨如何在 C++中实现动态数组,包括使用内置数据结构和自定义实现的方法,同时分析其性能特点和应用场景。 一、引言 在编程过程中,我们经常会遇到需要存储一组数据的情况。...二、C++内置动态数组实现——std::vector 1. std::vector 的基本用法 std::vector 是 C++标准库中提供的一种动态数组容器。...3. std::vector 的应用场景 std::vector 适用于需要动态存储和访问元素的场景,比如存储一组数据进行计算、处理用户输入等。它的易用性和高效性使得它在 C++编程中被广泛使用。...五、结论 在 C++中,实现动态数组有多种方法,既可以使用标准库中的 std::vector,也可以自定义实现。每种方法都有其特点和适用场景,我们需要根据实际需求进行选择。

    19410

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——7.list(无习题)

    C++ 中的 list 容器详细总结 1. 什么是 list? list文档 list 是 C++ 标准模板库 (STL) 中的一种容器类型,采用双向链表的数据结构来存储数据。...list 适用于需要频繁进行插入和删除操作的场景,其效率比动态数组(如 vector)更高,但不支持随机访问。与 vector 使用连续内存存储不同,list 的节点在内存中并不连续存储。...缓存不友好:由于 list 的节点在内存中是分散存储的,无法利用 CPU 缓存的局部性原理,因此在遍历大量数据时,性能不如连续存储的容器(如 vector)。...3. list 的常用操作与函数 3.1 创建与初始化 创建和初始化 C++ 中的 list 容器可以通过多种方式创建和初始化,以下是一些常见的方式: #include int main...总结 C++ 中的 list 容器是一种基于双向链表的数据结构,适合需要频繁插入和删除元素的场景。list 提供了灵活的增删操作和双向迭代器,能够在常数时间内完成插入和删除操作。

    11510

    【C++】vector

    `vector` 是一种容器,广泛存在于多种编程语言中,如 C++、Rust、Java 等。它是一种动态数组,可以存储任意类型的元素,并且可以根据需要自动调整大小。...下面我将详细介绍 `vector` 的概念和使用方法,主要以 C++ 中的 `std::vector` 为例。 ### 1....- **随机访问**:由于元素存储在连续的内存块中,可以通过索引快速访问任何一个元素。 - **迭代器支持**:`vector` 支持标准库迭代器,可以方便地遍历元素。...容器适配器 `vector` 还可以作为其他容器的基础,比如 `stack`(栈)、`queue`(队列)等,通过限制 `vector` 的某些接口来实现特定的数据结构。 ### 5....注意事项 - **线程安全**:C++ 标准库中的 `std::vector` 不是线程安全的,如果多个线程同时访问同一个 `vector`,需要自行实现同步机制。

    8810

    c++stl

    C++ STL 教程在前面的章节中,我们已经学习了 C++ 模板的概念。...C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。...C++ 标准模板库的核心包括以下三个组件:组件描述容器(Containers)容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。...下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:实例#include #include vector>using namespace std; int main(){ // 创建一个向量存储 int vector vec; int i; // 显示 vec 的原始大小

    52910

    浅谈C++基本框架内涵及其学习路线

    标准库(STL) C++标准库(STL)提供了大量的函数和数据结构,如向量、队列、堆栈、链表等,这些工具极大地简化了编程工作。STL中的容器、迭代器和算法为程序开发提供了强大的支持。...多范式支持 C++不仅支持面向对象编程,还支持面向过程编程、泛型编程和函数式编程等多种编程范式。这种多范式支持使得C++在各种应用场景中都具有广泛的适用性。...基础阶段 C++基础语法 在学习C++时,首先需要掌握基础语法,包括变量、数据类型、运算符和控制结构等。这是编写C++程序的基础。...函数和作用域 函数是C++程序的基本模块,作用域规则定义了变量的生命周期和可见性。 指针和引用 指针用于存储变量的地址,引用是变量的别名,两者都用于内存操作和函数参数传递。...容器 vector、list、deque、set、map等容器用于存储和管理数据。 迭代器和算法 迭代器用于遍历容器中的元素,算法用于对数据进行各种操作,如排序、查找等。 7.

    14010

    【Example】C++ Template (模板)概念讲解及编译避坑

    引用 Microsoft Docs: 模板是 c + + 中的泛型编程的基础。 作为强类型语言,c + + 要求所有变量都具有特定类型,由程序员显式声明或由编译器推断。...但是,许多数据结构和算法的外观都是相同的,无论它们的操作类型是什么。 利用模板,您可以定义类或函数的操作,并允许用户指定这些操作应使用的具体类型。...总结:模板是 C++ 当中支持参数类型与返回值动态化的工具,使开发人员可以动态自定义函数、类中参数与返回值类型。 模板又分为两种:函数模板 与 类模板。...进行在模板函数调用时,编译器会根据变量类型推断函数参数类型。 那么,函数模板是否可以支持多种类型呢?可以!...+ 标准库 std::condition_variable 【Example】C++ 用于编译时封装的 Pimpl 演示 (编译防火墙 Private-IMPL) 【Example】C++ 单例模式 演示代码

    80020

    【Example】C++ 标准库常用容器全面概述

    了解每一种容器的特性、知道什么情况下用什么容器就可以。 序列式容器 序列容器是指在逻辑上以线性排列方式存储给定类型元素的容器。...当你以局部变量形式创建并初始化 vector 时,对象本身是存储于栈内存当中,但是它所存储的元素却是在堆内存当中连续的一块空间,因此 std::vector 对于随机访问效率会非常高。...在现代C++中,主张使用 std::array 替代传统样式的数组。 std::array 提供的功能也比 std::vector、std::list 更简单。...key_eq 返回用于比较键相等性的函数对象。 std::pair 与 std::tuple 可以同时存储不同数据类型的容器,它们两个都有各自的优势与最佳用途。...每种适配器都限制了一些基础容器类的功能,以便对标准数据结构提供精确控制的接口。 stack 类支持) 数据结构的后进先出 (后进先出。 可以在脑海中将其类比为一摞盘子。

    3.4K30

    深入理解C++中的栈与队列:概念、底层机制与高效操作指南

    通过这些容器,我们可以高效地管理元素的插入、删除和访问,适用于多种实际编程场景。...链表实现适用于栈大小动态变化的场景,并且内存使用更加灵活,但会带来存储开销增加的缺点。 不同的实现方式针对的场景各不相同,选择合适的底层容器取决于应用程序的特定需求和使用模式。...这意味着,第一个插入到队列中的元素将是第一个被移除的元素。队列是一种常用的数据结构,在很多应用场景中用于缓冲处理顺序性任务,比如任务调度、消息传递等。...5.1 什么是底层容器? C++中的queue并不是一种独立的容器,它是容器适配器的一种。这意味着,queue不直接管理元素的存储,而是依赖于其他容器来完成实际的存储操作。...可以自定义使用list或vector作为底层容器,具体选择取决于使用场景的需求。 六、Queue的成员函数 C++标准库中的queue容器适配器提供了一组用于操作队列的成员函数。

    89110

    容器适配器:深入理解Stack与Queue的底层原理

    LIFO, Last In First Out)的数据结构,通常用于存储临时数据或实现递归。...底层容器:栈通常使用 deque 或 vector 作为底层容器来存储元素。选择哪种容器取决于具体的实现和性能要求。 模板类:栈是一个模板类,可以存储任意类型的元素。...priority_queue的使用 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置...仿函数的使用使得priority_queue能够支持多种排列规则,而不需要修改底层容器的实现。 仿函数的使用场景 排序:在STL算法(如std::sort)中,可以使用仿函数自定义排序准则。...筛选:在STL算法(如std::remove_if)中,可以使用仿函数定义筛选条件。 优先级队列:在std::priority_queue中,仿函数用于定义元素的优先级排序。

    18310

    【C++航海王:追寻罗杰的编程之路】C++11(一)

    1 -> C++11简介 在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。...2 -> 统一的列表初始化 2.1 -> {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...<< endl; return 0; } std::initializer_list使用场景: std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加...3.1 -> auto 在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局 部的变量默认就是自动存储类型,所以auto就没什么价值了。...C++11中废弃auto原来的用法,将 其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初 始化值的类型。

    7510
    领券