首页 > 编程语言 >用现代C++写一个python的简易型list

用现代C++写一个python的简易型list

时间:2023-09-08 21:22:30浏览次数:39  
标签:std cout int list back C++ 简易型 lst size

std::variant介绍:en.cppreference.com/w/cpp/utility/variant

 

  通过泛型模板(仅提供了int, double, string三种类型的存储),实现了append, pop, front, back, size等方法,并且通过重载运算符实现了对负数索引的访问。

#include <iostream>
#include <vector>
#include <variant>
#include <string>

class PythonList {
    public:
        template <class T>
        void append(const T& item) {
            v.push_back(item);
        }

        void pop() {
            v.pop_back();
        }

        template <class T>
        T& front() const {
            return std::get<T>(v.front());
        }

        template <class T>
        T& back() const {
            return std::get<T>(v.back());
        }

        std::size_t size() const {
            return v.size();
        }

        std::variant<int, double, std::string> operator[] (int index) const {
            if (index >= 0)
                return v[index];
            std::size_t n{v.size()};
            return v[n + index];
        }

    private:
        std::vector<std::variant<int, double, std::string>> v;
};

int main() {
    PythonList lst;
    lst.append(1);
    lst.append(3.14);
    lst.append("Hello World");

    int n = lst.size();
    for (int i{}; i < n; ++i) {
        if (std::holds_alternative<int>(lst[i]))
            std::cout << "Type: int\n";
        else if (std::holds_alternative<double>(lst[i]))
            std::cout << "Type: double\n";
        else if (std::holds_alternative<std::string>(lst[i]))
            std::cout << "Type: string\n";
    }

    for (int i{-1}; i >= -3; --i) {
        if (std::holds_alternative<int>(lst[i]))
        std::cout << "Type: int\n";
        else if (std::holds_alternative<double>(lst[i]))
            std::cout << "Type: double\n";
        else if (std::holds_alternative<std::string>(lst[i]))
            std::cout << "Type: string\n";
    }
}

  如果不用variant,也可以通过union来实现不同类型的存储,variant可以视作为现代C++的union,并且能实现自动析构。

标签:std,cout,int,list,back,C++,简易型,lst,size
From: https://www.cnblogs.com/ChebyshevTST/p/17684876.html

相关文章

  • C++语言学习12
    STL算法组件STL算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为[first,last),其中last指代要查询或修改的最后元素的后一个元素。include不修改序列的操作调用函数之后,不会影响序列中本来元素的值all_of所有都满......
  • C++多线程编程:包括多线程打印ABC、线程池实现等等
    #include<iostream>#include<thread>#include<mutex>#include<condition_variable>std::condition_variablecond;std::mutexprint_mutex;intflag=0;voidprint_thread(intnum){for(inti=0;i<10;i++)//循环{......
  • C++之进化后的 const 分析
    @TOC前言从C演变而来的C++是一种功能更为丰富和面向对象的编程语言。在C++中,const关键字用于表示常量,其用法与C中的const有了一些进化和扩展。本文将探讨C到C++的const的进化,以及在C++中使用const的一些特性和用法。C语言中的constconst修饰的变量是只读的,本质上还是变量。const修......
  • 所以说,java的“方法”有点儿类似于C++的"函数"吧
    两个语言的区别就是,C++如果函数写在下面的话,要在上面注释:而java的方法若写在下面的话,要加static,然后不管怎样,前面一定要加public......
  • C++开发认证
    练习B如果在try块中用throw"error";语句抛出一个异常,则参数类型是()的catch块能够捕获这个异常:(3.0分)Aint*Bconstchar*CcharDconstint2.D关于类模板的模板参数说法正确的是:(3.0分)A只可作为数据成员的类型B只可作为成员函数的返回值类型C只可......
  • mupdf实用操作demo,C++操作PDF文件
    前文:最近有个项目,需要读写PDF,本来想着挺简单的,读写PDF有那么多的库可以使用,唰唰的就完成了。忘记了我写C++的,还是在国产系统上开发的。所以一般的东西还不好使,因为项目需要在多个架构的电脑上使用,所以必须要开源,还要支持读写才行。 找了很多个PDF库(libharu、mupdf、pdfium、......
  • C++系列十:MFC
    目录前言:Helloworld:前言:仅是简单了解,运行,看看是啥。环境:Helloworld:......
  • linux c++ tcp
    1.TCP/IP协议栈链路层:负责下图所示物理链接标准IP层(网络层):选择合适的路径传输数据,无法解决数据传输错误问题,所以需要TCP/UDP协议作为保障TCP/UDP(传输层):IP层(网络层)解决传输路径问题,确定了路径,就进行传输数据,IP层只关注一个数据包如何进行传输,至于传输过程数据包是否损坏,传输......
  • C++ 归并排序
    #include<iostream>#include<vector>usingnamespacestd;///合并voidmerge(vector<int>&nums,intl1,intr1,intl2,intr2,vector<int>&tmp){ intleft=l1,right=r2;intk=l1;while(l1<=r1&&......
  • list集合分组拆分
    #n组publicstatic<T>List<List<T>>averageAssign(List<T>source,intn){List<List<T>>result=Lists.newArrayList();intrenumber=source.size()%n;intnumber=source.size()/n;......