Menu
CoddyTech

回顾:泛型容器

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 69 课,共 104 课。

challenge icon

挑战

简单

让我们创建一个 GenericContainer 类模板,把你在本章学到的所有模板知识结合起来。你将创建一个灵活且类型安全的容器,它可以动态存储元素,并通过模板技术提供实用的操作。

你需要将代码分别写在两个文件中:

  • GenericContainer.h:在这里定义类模板。你的 GenericContainer 应该:

    使用指向数组的指针动态存储元素,并跟踪当前大小和容量。

    提供以下核心方法:

    • 接收初始容量的构造函数
    • 能正确清理动态内存的析构函数
    • push(T value):向容器添加一个元素(本挑战中,假设容量始终足够)
    • get(size_t index):返回给定索引处的元素
    • getSize():返回当前元素数量

    添加名为 printContainer 的函数模板,接收一个 GenericContainer<T>&,并打印所有元素,元素之间用空格分隔,最后换行。

    为 GenericContainer<bool> 创建 printContainer 的模板特化版本,打印 true 或 false,而不是 1 或 0。

    添加名为 pushAll 的可变参数函数模板,接收一个 GenericContainer<T>& 和任意数量的值,并使用折叠表达式将每个值推入容器。

  • main.cpp:读取五个输入(每个输入各占一行):
    1. 第一个整数
    2. 第二个整数
    3. 第三个整数
    4. 一个 double 值
    5. 一个以字符串形式表示的布尔值(true 或 false)

    通过以下操作演示你的容器:

    1. 创建一个容量为 10 的 GenericContainer<int>
    2. 使用 pushAll 一次性添加三个整数
    3. 打印大小:Int container size: <size>
    4. 调用 printContainer 显示这些整数
    5. 创建一个容量为 5 的 GenericContainer<double>
    6. 分别调用 push,推入 double 值和字面值 2.5
    7. 调用 printContainer 显示这些 double 值
    8. 创建一个容量为 5 的 GenericContainer<bool>
    9. 推入布尔输入值和字面值 false
    10. 调用 printContainer 显示这些布尔值(应显示 true/false)

例如,输入 10、20、30、3.14 和 true 时:

Int container size: 3
10 20 30 
3.14 2.5 
true false 

这个挑战结合了用于容器的类模板、用于自定义布尔值打印的模板特化,以及用于实现灵活 pushAll 函数的可变参数模板。你的容器遵循 RAII 原则管理自身内存,展示了模板如何与恰当的资源管理相结合。

亲手试试

#include <iostream>
#include <string>
#include "GenericContainer.h"

using namespace std;

int main() {
    // 读取输入
    int num1, num2, num3;
    double doubleVal;
    string boolStr;
    
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> doubleVal;
    cin >> boolStr;
    
    // 将字符串转换为 bool
    bool boolVal = (boolStr == "true");
    
    // TODO: 创建容量为 10 的 GenericContainer<int>
    
    // TODO: 使用 pushAll 一次性添加 3 个整数
    
    // TODO: 输出大小:"Int container size: <size>"
    
    // TODO: 调用 printContainer 显示整数
    
    // TODO: 创建容量为 5 的 GenericContainer<double>
    
    // TODO: 分别调用 push,添加 double 值和 2.5
    
    // TODO: 调用 printContainer 显示 double 值
    
    // TODO: 创建容量为 5 的 GenericContainer<bool>
    
    // TODO: 添加布尔输入值和 false
    
    // TODO: 调用 printContainer 显示布尔值
    
    return 0;
}

面向对象编程中的所有课

自己练习: C++ 在线编译器