C++ 实现Python 列表list 的两种方法

1、vector里面放多种参数。在C++中,如果你想要在std::vector中存储不同类型的参数,你可以使用std::any(C++17及以上)或std::variant(C++17以前的版本需要使用Boost库或者C++17及以上标准)。以下是使用std::vector<std::any>的例子:

#include <iostream>
#include <vector>
#include <any>

int main() {
    std::vector<std::any> vec;

    vec.push_back(42);
    vec.push_back("hello");
    vec.push_back(3.14);

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

    return 0;
}

2、接下来的代码使用C++11标准 

#include <iostream>
#include <vector>
#include <typeinfo>
#include <string>


class PyType {
private:
    std::string valueType;
    void* value;

public:
    template <typename T>
    PyType(T __value__) {
        valueType = typeid(__value__).name();
        value = new T(__value__);
    }

    template <typename T>
    T getValue() {
        return *static_cast<T*>(value);
    }

    std::string getType() {
        return valueType;
    }
};

class PyList {
private:
    std::vector<PyType> values;

public:

    PyList() {
    }


    //void init(auto initvalues, ...) {
    //
    //}

    template <typename T>
     void append(T value) {
        values.push_back(PyType(value));
    }

    template <typename T>
    T get(int index) {
        return values[index].getValue<T>();
    }

    std::string getType(int index) {
        return values[index].getType();
    }

    int getlength() {
        return(values.size());
    }
};

int main() {
    PyList mylist;

    mylist.append<int>(10);
    mylist.append<std::string>("Hello");
    mylist.append<double>(3.14);
    mylist.append<std::string>(" Hello World! ");

    for (int i = 0; i < 100; i++) {
        mylist.append<int>(i);
    }

    // std::cout << "Element at index 0: " << mylist.get<int>(0) << std::endl;
    // std::cout << "Element at index 1: " << mylist.get<std::string>(1) << std::endl;
    // std::cout << "Element at index 2: " << mylist.get<double>(2) << std::endl;


    for (int i = 0; i < mylist.getlength(); i++) {
        //判断类型并且将类型与内容打印在屏幕上
        std::string typeofValue = mylist.getType(i);
        std::cout << "type of index[" << i << "]" << " is " << typeofValue << " value is ";

        if (typeofValue == "int") {
            std::cout << mylist.get<int>(i);
        }
        else if (typeofValue == "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >") {
            std::cout << mylist.get<std::string>(i);
        }
        else if (typeofValue == "double") {
            std::cout << mylist.get<double>(i);
        }
        //添加换行符
        std::cout << std::endl;
    }


    return 0;
} 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: list删除结构体的方式有两种: 1. 通过循环遍历list,找到需要删除的结构体并将其移除。具体步骤如下: - 声明一个变量i,用于记录循环迭代的次数; - 使用for循环遍历list中的每个元素,同时使用range(len(list))来指定循环次数; - 在循环体中,使用if语句判断当前元素是否为需要删除的结构体; - 如果是需要删除的结构体,使用del语句将其从list中删除; - 否则,将i自增1,继续遍历下一个元素; - 循环结束后,list中的结构体被删除。 2. 使用列表的remove()方法来删除结构体。具体步骤如下: - 使用remove()方法参数传递需要删除的结构体,即list.remove(需要删除的结构体); - remove()方法会从list中找到第一个与参数匹配的元素,并将其删除; - 如果list中有多个相同的结构体,只会删除第一个匹配的元素; - 如果list中没有与参数匹配的元素,会抛出ValueError异常。 以上是两种常见的删除结构体的方法开发者可以根据具体的需求和场景选择合适的方法进行操作。 ### 回答2: 要删除一个结构体在C语言中的链表中的节点,可以遵循以下步骤: 1. 首先,检查链表是否为空。如果链表为空,则无法删除节点。 2. 创建两个指针变量,一个用于遍历链表,一个用于指向要删除的节点。 3. 初始化遍历指针为链表的头指针。 4. 使用循环语句遍历链表直到找到要删除的节点或者到达链表的末尾。 5. 如果找到要删除的节点,则将指向要删除节点的指针变量指向该节点的下一个节点,同时释放要删除的节点的内存。 6. 如果没有找到要删除的节点,则输出提示信息。 7. 更新链表的头指针,如果要删除的节点是链表的头节点,则将头指针指向要删除节点的下一个节点。 下面是一个简单的实现示例: ```c #include <stdio.h> #include <stdlib.h> // 定义链表的节点结构体 struct Node { int data; struct Node* next; }; // 删除链表中的节点函数 void deleteNode(struct Node** head, int value) { if (*head == NULL) { printf("链表为空,无法删除节点。\n"); return; } // 创建两个指针变量 struct Node *current = *head; struct Node *previous = NULL; // 遍历链表找到要删除的节点 while (current != NULL && current->data != value) { previous = current; current = current->next; } // 如果找到要删除的节点,则删除 if (current != NULL) { // 更新指针 if (previous != NULL) { previous->next = current->next; } else { *head = current->next; } // 释放内存 free(current); } else { printf("找不到要删除的节点。\n"); } } // 打印链表的函数 void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } int main() { // 创建链表 struct Node* head = NULL; struct Node* second = NULL; struct Node* third = NULL; head = (struct Node*)malloc(sizeof(struct Node)); second = (struct Node*)malloc(sizeof(struct Node)); third = (struct Node*)malloc(sizeof(struct Node)); head->data = 1; head->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL; // 打印原链表 printf("原链表: "); printList(head); // 删除节点 deleteNode(&head, 2); // 打印删除节点后的链表 printf("删除节点后的链表: "); printList(head); return 0; } ``` 这只是一个基本的示例,你可以根据具体的需求进行修改和扩展。 ### 回答3: 删除结构体类型的元素时,需要先确定待删除的元素的位置。可以通过遍历列表的方式,逐个比较元素的属性值,找到要删除的元素的下标。然后使用列表的pop()方法,将该下标对应的元素从列表中删除。 以下是一个示例代码: ```python class Student: def __init__(self, name, age, grade): self.name = name self.age = age self.grade = grade # 创建结构体实例 student1 = Student("小明", 12, 6) student2 = Student("小红", 13, 7) student3 = Student("小刚", 11, 5) # 创建结构体列表 students = [student1, student2, student3] # 遍历列表,找到要删除的元素的下标 for i in range(len(students)): if students[i].name == "小红": # 删除该元素 students.pop(i) break # 打印删除后的列表 for student in students: print(student.name, student.age, student.grade) ``` 以上代码创建了一个包含3个学生结构体的列表,然后通过遍历列表找到了姓名为"小红"的学生,并将其从列表中删除。最后打印删除后的列表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值