STL-traits与迭代器

实验目的:

  1. 练习课堂上讲过的traits技术
  2. 练习迭代器实现

实验器材:

Code blocks

实验内容:

一、练习课本第8页2.2章节traits技术。根据例2.3和后续分析,结合回忆课堂演示,利用traits技术实现CApply类,可统一对CIntArray和CFloatArray中的元素进行乘总数的求和运算。

int main() {

MyArray<int> ma;

ma.add(1);

ma.add(2);

ma.add(3);

ma.add(4);

MyArrayInterator<int> it = ma.begin();

while(it != ma.end()) {

cout << *it << “\t”;

it++;

}

cout << endl;

}

二、练习迭代器的实现。实现课本第17页例3.1中的MyArray类(即课堂上讲过的动态数组)对应的迭代器MyArrayIterator。MyArray和MyArrayIterator实现成两个单独的类。实现上面两个类后,在main函数中,可通过下面代码输出MyArray的所有元素。

实验步骤:

一:

#include <iostream>

#include <string>

using namespace std;

class CIntArray {

    int a[10];

public:

typedef int inputtype;

    typedef int resulttype;

    CIntArray() {

        for(int i=0; i<10; i++) {

            a[i] = i+1;

        }

    }

    int GetSum(int times) {

        int sum = 0;

        for(int i=0; i<10; i++) {

            sum += a[i];

        }

        return sum * times;

    }

};

class CFloatArray {

    float a[10];

public:

typedef int inputtype;

    typedef int resulttype;

    CFloatArray() {

        for(int i=1; i<=10; i++) {

            a[i-1] =1.0f/i;

        }

    }

    float GetSum(float times) {

        float sum = 0.0f;

        for(int i=0; i<10; i++) {

            sum += a[i];

        }

        return sum * times;

    }

};

//定义基本模板类

template<class T>

class NumTraits {

};

//模板特化

template<>

class NumTraits<CIntArray> {

public:

typedef int inputtype;

    typedef int resulttype;

};

//模板特化

template<>

class NumTraits<CFloatArray> {

public:

typedef float inputtype;

    typedef float resulttype;

};

template<class T>

class CApply {

public:

    typename NumTraits<T>::resulttype GetSum(T &t, typename NumTraits<T>::inputtype inpara) {

        return t.GetSum(inpara);

    }

};

int main() {

    CIntArray int_arr;

    CApply<CIntArray> c_apply_int;

    int res = c_apply_int.GetSum(int_arr, 3);

    cout << res << endl;

    CFloatArray float_arr;

    CApply<CFloatArray> c_apply_float;

    float res2 = c_apply_float.GetSum(float_arr, 3.2);

    cout << res2 << endl;

    return 0;

}

二:

#include<string>

#include<iostream>

using namespace std;

template<class T>

class MyArray

{

private:

int m_nTotalSize;

int m_nValidSize;

T* m_pData;

public:

MyArray(int nSize = 3)

{

m_pData = new T[nSize];

m_nTotalSize = nSize;

m_nValidSize = 0;

}

void Add(T value)

{

if (m_nValidSize < m_nTotalSize)

{

m_pData[m_nValidSize] = value;

m_nValidSize++;

}

else

{

T* tmpData = new T[m_nTotalSize];

//原始数据备份

for (int i = 0; i < m_nTotalSize; i++)

{

tmpData[i] = m_pData[i];

}

delete[]m_pData;

m_nTotalSize *= 2;

m_pData = new T[m_nTotalSize];

for (int i = 0; i < m_nValidSize; i++)

{

m_pData[i] = tmpData[i];

}

delete[]tmpData;

m_pData[m_nValidSize] = value;

m_nValidSize++;

}

}

T* Begin() {

return m_pData;

}

T* End() {

return m_pData + m_nValidSize;

}

int GetSize()

{

return m_nValidSize;

}

T Get(int pos)

{

return m_pData[pos];

}

virtual~MyArray()

{

if (m_pData != NULL)

{

delete[]m_pData;

m_pData = NULL;

}

}

};

template<class Init>

class MyArrayInterator

{

Init* init;

public:

MyArrayInterator(Init* init)

{

this->init = init;

}

bool operator!=(MyArrayInterator& it)

{

return this->init != it.init;

}

void operator++(int)

{

init++;

}

Init operator* ()

{

return *init;

}

};

int main()

{

MyArray<int> ma;

ma.Add(1);

ma.Add(2);

ma.Add(3);

ma.Add(4);

MyArrayInterator<int> it = ma.Begin();

MyArrayInterator<int> at = ma.End();

while (it != at)

{

cout << *it << '\t';

it++;

}

cout << endl;

}

实验结果(附数据和图表):

实验结果分析及结论:

traits 技术使得代码更加模块化,可以更好地组织代码结构,提高代码的可读性。traits 技术有助于提高代码的可扩展性,当需要添加新的功能时,可以通过扩展现有的 traits 来实现,而无需修改已有的代码。

迭代器在遍历数据集合时的优势,比如节省内存空间、支持多种数据类型等。

实验心得体会和建议:

traits 技术实验使我们能够深入理解 traits 的基本概念、用途和实现方法,掌握如何使用 traits 来提高代码质量和可维护性。通过实验,我们还学会了如何将 traits 与其他 C++特性相结合,以实现更复杂、更通用的功能。这将有助于他们在实际编程中更好地利用 traits 技术,提高代码质量和开发效率。

迭代器实验使我们能够深入理解迭代器的基本概念、用途和实现方法,掌握如何使用迭代器来遍历容器和执行算法操作。通过实验,我们还学会了如何使用迭代器的特定操作来完成更复杂的任务。这将有助于他们在实际编程中更好地利用迭代器技术,提高代码质量和开发效率。同时,我们还应了解迭代器的局限性,以便在实际编程中做出更明智的选择。

                                      

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值