首页
学习
活动
专区
工具
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++标准库:使用STL提供数据结构和算法

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

52620
  • c++基础知识

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

    1.1K40

    C++容器vector

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

    71420

    移情别恋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 提供了灵活增删操作和双向迭代器,能够常数时间内完成插入和删除操作。

    7610

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

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

    11210

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

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

    3.3K30

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

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

    72020

    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++98auto是一个存储类型说明符,表明变量是局部自动存储类型,但是局部域中定义局 部变量默认就是自动存储类型,所以auto就没什么价值了。...C++11废弃auto原来用法,将 其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初 始化值类型

    6810

    c++stl

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

    52110

    容器适配器:深入理解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,仿函数用于定义元素优先级排序。

    12110

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

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

    7510

    C++】STL:栈和队列模拟实现

    前言 hello hello~ ,这里是大耳朵土土垚~ ,欢迎大家点赞关注收藏 1.stack和queue简介 C++stack(栈)和queue(队列)是两种常见数据结构用于存储和管理数据...栈是一种先进后出(LIFO)数据结构,类似于我们平时堆叠一摞书,只能在顶部进行操作。C++,可以使用std::stack模板类来创建栈。...C++,可以使用std::queue模板类来创建队列。队列主要操作包括插入(push)元素到队尾、删除(pop)队头元素以及获取队头元素等。...C++,stack和queue都是基于deque(双端队列)实现,默认使用deque容器作为底层数据结构。...stack是使用什么容器来实现存储和管理数据了,默认传入是deque容器(给是缺省值) deque(双端队列)是C++标准库一种容器,它可以两端进行插入和删除操作。

    13610

    初识STL

    STL C++ STL(标准模板库)是一套功能强大 C++ 模板类,提供了通用模板类和函数,这些模板类和函数可以实现多种流行和常用算法和数据结构,如向量、链表、队列、栈。...STL六大组件交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器内容,仿函数可以协助算法完成不同策略变化,适配器可以修饰仿函数。...常用数据结构:数组(array) , 链表(list), tree(树),栈(stack), 队列(queue), 集合(set),映射表(map), 根据数据容器排列特性,这些数据分为序列式容器和关联式容器两种...关联式容器是非线性结构,更准确说是二叉树结构。各元素之间没有严格物理上顺序关系,也就是说元素容器并没有保存元素置入容器逻辑顺序。...一书中提供了23种设计模式完整描述, 其中iterator模式定义如下:提供一种方法,使之能够依序寻访某个容器所含各个元素,而又无需暴露该容器内部表示方式。

    11410

    【C++11】入门基础

    统一列表初始化 2.1{}初始化   C++98,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...std::initializer_list是一个标准库类型C++11引入。它是一个模板类,用于不使用显式构造函数情况下,以统一方式初始化容器或其他对象。 3....3.1 auto   C++98auto是一个存储类型说明符,表明变量是局部自动存储类型,但是局部域中定义局部变量默认就是自动存储类型,所以auto就没什么价值了。...,我们就可以省去写很长类型麻烦了 3.2 decltype   decltype是declaration type缩写,C++,decltype是一个类型推断关键字,用于获取表达式类型。...范围for循环   C++范围for循环是一种简化循环结构,可以用来遍历容器、数组和其他可迭代对象元素。

    5010
    领券