首页 > 其他分享 >简单的顺序存储容器

简单的顺序存储容器

时间:2024-01-15 18:00:46浏览次数:33  
标签:std 容器 printf 顺序存储 __ 简单 test Array array

本文简述了一个实现了顺序存储的容器类(Array),并对其进行了验证。

此 Array 类具有如下能力:

  • 支持泛型
  • 指定存储容量
  • 可用列表(initializer_list)初始化
  • 支持拷贝和移动语义
  • 可按值或引用传递此类的对象,也可作为值返回
  • 可用下标运算符访问元素
  • 支持基于范围的循环

◆ 实现

使用类模板,支持泛型(array.hxx),

template <class _T>
class Array
{...

    size_t
    __size__;


    shared_ptr<_T>
    __buffer__;

...

在构造函数中,指定存储容量,

Array(size_t size = 0)
    : __size__(size), __buffer__(nullptr)
{...
}

在构造函数中,指定列表(initializer_list)初始化,

Array(initializer_list<_T> init)
    : __size__(init.size()), __buffer__(nullptr)
{...
}

实现拷贝、移动构造函数与赋值函数,可按值或引用传递该类的对象,也可作为值返回,

Array(Array const& other)
    : __size__(other.__size__), __buffer__(other.__buffer__)
{
}


Array(Array && other)
    : __size__(other.__size__), __buffer__(other.__buffer__)
{...
}


Array&
operator=(Array const& other)
{...
}


Array&
operator=(Array && other)
{...
}

可用下标运算符访问,

_T const&
operator[](size_t idx) const
{...
}


_T &
operator[](size_t idx)
{...
}

实现 begin()、end() 函数以支持基于范围的循环,

_T const*
begin() const
{...
}


_T *
begin()
{...
}


_T const*
end() const
{...
}


_T *
end()
{...
}

◆ 逻辑

以下类图展现了 Array 类的主要逻辑结构。

class

◆ 验证

为了验证此类满足的能力,设计了如下的测试用例(test_array.cpp),

static
void
test_array_default_constructor()
{
    std::printf("\n%70s\n", "[test_array_default_constructor]");
    Array<int> a(3);
    a[0] = 10, a[1] = 11, a[2] = 12, a[3] = 13;
    std::printf("\na[0] = %d, a[2] = %d\n", a[0], a[2]);
}


static
void
test_array_initializer_constructor()
{
    std::printf("\n%70s\n", "[test_array_initializer_constructor]");
    Array<char> a({'a','b','c','d'});
    std::printf("\na[1] = %c, a[3] = %c\n", a[1], a[3]);
}


static
void
test_array_copy_constructor()
{
    std::printf("\n%70s\n", "[test_array_copy_constructor]");
    Array<char> a({'x','y','z'});
    Array<char> b(a);
    Array<int> c ;
    c = a_new_array();
    std::printf("\na[0] = %c, a[2] = %c\n", a[0], a[2]);
    std::printf("\nb[0] = %c, b[2] = %c\n", b[0], b[2]);
    std::printf("\nc[0] = %d, c[2] = %d\n", c[0], c[2]);
}


static
void
test_array_move_constructor()
{
    std::printf("\n%70s\n", "[test_array_move_constructor]");
    Array<int> a(5);
    a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4;
    Array<int> b = std::move(a);
    //std::printf("\na[0] = %d, a[4] = %d\n", a[0], a[4]);
    std::printf("\nb[0] = %d, b[4] = %d\n", b[0], b[4]);
}


static
void
test_array_copy_assign_operator()
{
    std::printf("\n%70s\n", "[test_array_copy_assign_operator]");
    Array<int> a(5);
    a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4;
    Array<int> b(5);
    b = a;
    std::printf("\na[1] = %d, a[4] = %d\n", a[1], a[4]);
    std::printf("\nb[1] = %d, b[4] = %d\n", b[1], b[4]);
}


static
void
test_array_move_assign_operator()
{
    std::printf("\n%70s\n", "[test_array_move_assign_operator]");
    Array<int> a(5);
    a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4;
    Array<int> b(5);
    b = std::move(a);
    //std::printf("\na[1] = %d, a[4] = %d\n", a[1], a[4]);
    std::printf("\nb[1] = %d, b[4] = %d\n", b[1], b[4]);
}


static
void
test_array_shared()
{
    std::printf("\n%70s\n", "[test_array_shared]");
    Array<char> a({'a','b','c','d'});
    {
        Array<char> b(a);
        b[1] = 'x';
        Array<char> c(b);
        c[3] = 'z';
    }
    std::printf("\na[1] = %c, a[2] = %c, a[3] = %c\n", a[1], a[2], a[3]);
}



static
void
test_array_rangedfor()
{
    std::printf("\n%70s\n", "[test_array_rangedfor]");
    Array<char> a({'a','b','c','d'});
    for (char x : a)
        std::printf("%2c", x);
    std::printf("\n");
}

编译代码(-std=c++11)成功后运行可执行文件。以下是执行过程中的部分输出,

                                      [test_array_default_constructor]
a[0] = 10, a[2] = 12


                                  [test_array_initializer_constructor]
a[1] = b, a[3] = d


                                         [test_array_copy_constructor]
a[0] = x, a[2] = z
b[0] = x, b[2] = z
c[0] = 10, c[2] = 12


                                         [test_array_move_constructor]
b[0] = 0, b[4] = 4


                                     [test_array_copy_assign_operator]
a[1] = 1, a[4] = 4
b[1] = 1, b[4] = 4


                                     [test_array_move_assign_operator]
b[1] = 1, b[4] = 4


                                                   [test_array_shared]
a[1] = x, a[2] = c, a[3] = z


                                                [test_array_rangedfor]
 a b c d

◆ 最后

完整的代码请参考 [gitee] cnblogs/17964979

标签:std,容器,printf,顺序存储,__,简单,test,Array,array
From: https://www.cnblogs.com/green-cnblogs/p/17964979

相关文章

  • 设计模式--简单工厂模式
    目录概念使用场景概念简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。在C++中,简单工厂模式可以通过一个工厂类来实现,该工厂类负责根据输入参数创建不同的对象实例。下面是一个简单的C++示例来说明简单工厂模式的实现:#include<iostr......
  • 如何用 Python 编写一个简单的技术指标量化策略
    技术指标是通过对历史价格、成交量等数据进行计算,来预测未来市场走势的工具。Python作为一种流行的编程语言,提供了许多强大的库,如Pandas和NumPy,可用于处理金融数据并实现量化策略。下面我们将详细介绍如何用Python编写一个简单的技术指标量化策略。步骤一:导入所需库在开始之前,我们......
  • k8s(Kubernetes)一种用于自动部署、扩展和管理容器化应用程序的开源平台
    K8s全称为Kubernetes,是一种用于自动部署、扩展和管理容器化应用程序的开源平台。作为云原生技术的核心组件之一,其提供了大量灵活的Kubernetes教程,帮助开发人员和运维团队轻松地构建、交付和扩展应用程序,从而更好地应对不断增长的云端需求。K8s的核心是一个主节点,它负责管理和协调......
  • 163的POP、IMAP和SMTP设置教程,简单好用
    在今天的数字时代,电子邮件已经成为人们生活和工作中不可或缺的一部分。而对于使用163邮箱的用户来说,熟悉和了解163的POP、IMAP和SMTP设置是确保顺畅收发邮件的关键步骤之一。在本文中,我们将为您详细介绍163邮箱的POP、IMAP和SMTP设置教程,使您能够轻松地配置您的邮箱,实现简单而高效......
  • 管道通信(下)命名管道的使用实现简单的日志函数
     我们之前学习到的管道是没有名字的正因为没有没有名字所以最后选择的是让子进程继承父进程的方式来达到让父子进程看到同一份资源的方式。这也也就导致了匿名管道只能在具有血缘关系的进程进行进程间通信。但是我们需要进行进程间通信的场景并不是只有这一种的?如果是毫不相关的进......
  • 容器应用平台 Kasm
     Kasm介绍Kasm是一款基于Docker的容器应用平台,它提供企业级编排、数据丢失防护和Web流技术,以支持将容器化工作负载交付到你的浏览器。Kasm可以在浏览器內运行各种应用,比如:Linux桌面、浏览器、聊天工具、办公软件、多媒体工具等。Kasm将这些应用隔离在独立的Docker......
  • 如何运行.sh文件?一键搞定!教你几种简单方法!
    如何运行.sh文件?一键搞定!教你几种简单方法!.sh文件是一种使用Shell语言编写的脚本文件,它可以在Linux或Unix系统中执行一系列的命令。要运行.sh文件,您需要有一个支持Shell语言的解释器,例如bash、zsh或ksh。一、如果您使用的是Linux或Unix系统,您可以使用以下方法之一来运行.sh文件:1......
  • 吴师兄学算法day07 11. 盛最多水的容器
    题目:11. 盛最多水的容器难点:如何确定,每次只移动最短边,因为无论移动哪边的柱子,下面的底部一定是缩短的,剩下的就是取决于高度。如果移动的是,两侧高的那个,整体的面积一定是缩小的。如果移动的是,两侧底的那个,后面的柱子有可能是遇到高的,也有可能是低的,所以,整体面积可能大,也可......
  • 让 K8s 更简单!8款你不得不知的 AI 工具-Part 1
    介绍最近,AI引起了广泛关注,而Kubernetes驱动的DevOps也不例外。软件工程师是自动化的忠实拥护者,因此针对Kubernetes操作员的AI驱动工具自然也开始涌现。 这些工具大多专为终端(CLI)使用而设计。Kubernetes是容器编排的首选平台,而在AI驱动工具的帮助下可以从自动......
  • C#实现一个最简单的HTTP服务器
    C#实现一个最简单的HTTP服务器 简介本文用C#实现了一个最简单的HTTP服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于HTTP协议的知识。背景高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS,Apache,和Tomcat。然而,HTML是非常灵活的UI......