实验目的:
实验器材: Code blocks 实验内容: 一、练习课本第8页2.2章节traits技术。根据例2.3和后续分析,结合回忆课堂演示,利用traits技术实现CApply类,可统一对CIntArray和CFloatArray中的元素进行乘总数的求和运算。
二、练习迭代器的实现。实现课本第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 技术,提高代码质量和开发效率。 迭代器实验使我们能够深入理解迭代器的基本概念、用途和实现方法,掌握如何使用迭代器来遍历容器和执行算法操作。通过实验,我们还学会了如何使用迭代器的特定操作来完成更复杂的任务。这将有助于他们在实际编程中更好地利用迭代器技术,提高代码质量和开发效率。同时,我们还应了解迭代器的局限性,以便在实际编程中做出更明智的选择。
|
STL-traits与迭代器
于 2023-12-20 08:56:38 首次发布