c++中打印任意类型任意长度数组的各种方式

目录

一、代码

二、详细解释

1. print 函数模板

2. array_size 函数模板

3. print1 函数模板

4. print2 函数模板

5. my_begin 和 my_end 函数模板

6. print3 函数模板

7. main 函数

总结


一、代码

如下代码给出了5种方式打印任意类型任意长度的数组。这段代码定义了多个模板函数,用于处理数组的相关操作,包括计算数组大小、打印数组元素等。在 main 函数中,创建了一个整数数组 a 和一个字符串数组 vs,并使用不同的方式计算数组大小和打印数组元素。

#include<iostream>
#include<string>

template<typename T>
void print(const T* begin,const T* end)
{
    while(begin != end)
        std::cout<<*begin++<<" ";
    std::cout<<std::endl;
}

template<typename T>
void print(const T ta[],size_t size)
{
    for(size_t i = 0;i != size; i++)
        std::cout<<ta[i]<<" ";
    std::cout<<std::endl;
}

template<typename T,unsigned int N>
constexpr unsigned int array_size(const T (&arr)[N])
{
    return N;
}

template<typename T,unsigned int N>
void print1(const T (&arr)[N])
{
    for(size_t i = 0;i < N;i++)
        std::cout<<arr[i]<<" ";
    std::cout<<std::endl;
}

template<typename T,unsigned int N>
void print2(const T (&arr)[N])
{
    for(const auto &e : arr)
        std::cout<<e<<" ";
    std::cout<<std::endl;
}

template<typename T,unsigned int N>
const T* my_begin(const T (&arr)[N])
{
    return &arr[0];
}

template<typename T,unsigned int N>
const T* my_end(const T (&arr)[N])
{
    return arr + N;
}

template<typename T,unsigned int N>
void print3(const T (&arr)[N])
{
    for(auto it = my_begin(arr);it != my_end(arr);it++)
        std::cout<<*it<<" ";
    std::cout<<std::endl;
}

int main(int argc, char* argv[])
{
    int a[6] = {0,2,4,6,8,10};
    std::string vs[3] = {"Hello","World","!"};

    std::cout<<"1 size of a is:"<<array_size(a)<<std::endl;
    std::cout<<"2 size of a is:"<<sizeof(a)/sizeof(int)<<std::endl;
    std::cout<<"3 size of a is:"<<std::end(a) - std::begin(a)<<std::endl;
    std::cout<<"4 size of a is:"<<my_end(a) - my_begin(a)<<std::endl;

    std::cout<<"1-----------------------"<<std::endl;
    print(std::begin(a),std::end(a));
    print(std::begin(vs),std::end(vs));
    std::cout<<"2-----------------------"<<std::endl;
    print(a,std::end(a) - std::begin(a));
    print(vs,std::end(vs) - std::begin(vs));
    std::cout<<"3-----------------------"<<std::endl;
    print1(a);
    print1(vs);
    std::cout<<"4-----------------------"<<std::endl;
    print2(a);
    print2(vs);
    std::cout<<"5-----------------------"<<std::endl;
    print3(a);
    print3(vs);
    return 0;
}

输出

1 size of a is:6
2 size of a is:6
3 size of a is:6
4 size of a is:6
1-----------------------
0 2 4 6 8 10 
Hello World ! 
2-----------------------
0 2 4 6 8 10 
Hello World ! 
3-----------------------
0 2 4 6 8 10 
Hello World ! 
4-----------------------
0 2 4 6 8 10 
Hello World ! 
5-----------------------
0 2 4 6 8 10 
Hello World ! 

print1和print2只需要传入数组就可以。推荐使用。

二、详细解释

1. print 函数模板

template<typename T>
void print(const T* begin, const T* end)
{
    while(begin != end)
        std::cout << *begin++ << " ";
    std::cout << std::endl;
}
  • 该函数接受两个指向数组元素的指针 begin 和 end,通过遍历从 begin 到 end 的元素,将其输出到标准输出流,并在最后换行。
template<typename T>
void print(const T ta[], size_t size)
{
    for(size_t i = 0; i != size; i++)
        std::cout << ta[i] << " ";
    std::cout << std::endl;
}
  • 此函数接受一个数组 ta 和数组的大小 size,通过循环遍历数组元素并输出,最后换行。

2. array_size 函数模板

template<typename T, unsigned int N>
constexpr unsigned int array_size(const T (&arr)[N])
{
    return N;
}
  • 该函数接受一个数组的引用 arr,利用模板参数 N 来获取数组的大小,并返回该大小。constexpr 表示该函数可以在编译时求值。

3. print1 函数模板

template<typename T, unsigned int N>
void print1(const T (&arr)[N])
{
    for(size_t i = 0; i < N; i++)
        std::cout << arr[i] << " ";
    std::cout << std::endl;
}
  • 该函数接受一个数组的引用 arr,通过循环遍历数组元素并输出,最后换行。

4. print2 函数模板

template<typename T, unsigned int N>
void print2(const T (&arr)[N])
{
    for(const auto &e : arr)
        std::cout << e << " ";
    std::cout << std::endl;
}
  • 此函数使用范围 for 循环遍历数组 arr 中的每个元素 e,并将其输出到标准输出流,最后换行。

5. my_begin 和 my_end 函数模板

template<typename T, unsigned int N>
const T* my_begin(const T (&arr)[N])
{
    return &arr[0];
}

template<typename T, unsigned int N>
const T* my_end(const T (&arr)[N])
{
    return arr + N;
}
  • my_begin 函数返回数组 arr 的第一个元素的地址。
  • my_end 函数返回数组 arr 最后一个元素之后的地址。

6. print3 函数模板

template<typename T, unsigned int N>
void print3(const T (&arr)[N])
{
    for(auto it = my_begin(arr); it != my_end(arr); it++)
        std::cout << *it << " ";
    std::cout << std::endl;
}
  • 该函数使用自定义的 my_begin 和 my_end 函数来获取数组的起始和结束指针,通过指针遍历数组元素并输出,最后换行。

7. main 函数

int main(int argc, char* argv[])
{
    int a[6] = {0, 2, 4, 6, 8, 10};
    std::string vs[3] = {"Hello", "World", "!"};

    std::cout << "1 size of a is:" << array_size(a) << std::endl;
    std::cout << "2 size of a is:" << sizeof(a) / sizeof(int) << std::endl;
    std::cout << "3 size of a is:" << std::end(a) - std::begin(a) << std::endl;
    std::cout << "4 size of a is:" << my_end(a) - my_begin(a) << std::endl;

    std::cout << "1-----------------------" << std::endl;
    print(std::begin(a), std::end(a));
    print(std::begin(vs), std::end(vs));
    std::cout << "2-----------------------" << std::endl;
    print(a, std::end(a) - std::begin(a));
    print(vs, std::end(vs) - std::begin(vs));
    std::cout << "3-----------------------" << std::endl;
    print1(a);
    print1(vs);
    std::cout << "4-----------------------" << std::endl;
    print2(a);
    print2(vs);
    std::cout << "5-----------------------" << std::endl;
    print3(a);
    print3(vs);
    return 0;
}
  • 在 main 函数中,创建了一个整数数组 a 和一个字符串数组 vs
  • 使用不同的方式计算数组 a 的大小并输出。
  • 分别使用不同的 print 函数模板来打印数组 a 和 vs 的元素。

总结

这段代码展示了如何使用模板函数来处理数组的大小计算和元素打印,同时演示了不同的遍历数组的方式。通过使用模板函数,可以提高代码的复用性,使其适用于不同类型的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值