C++第10課 STL容器 (一)
阿新 • • 發佈:2021-09-07
1.array
myArray.hpp
//定義和實現寫在一起的時候,用hpp #include <iostream> using namespace std; template <class T, size_t _size> class MyArray { public: MyArray() { memory = new T[_size]; } T& operator[](int index) { return memory[index]; } public: T* begin() { returnmemory; } T* end() { return memory + _size; } T front() { return memory[0]; } T back() { return memory[_size - 1]; } T at(int index) { return memory[index]; } int size() { return _size; } class iterator { public: iterator operator=(T* pmove) {this->pMove = pmove; return *this; } bool operator!=(T* pmove) { return this->pMove != pmove; } iterator operator++(int) { this->pMove++; return (*this); } T operator*() {return pMove[0]; } protected: T* pMove; }; protected: T* memory; };
2.main.cpp
#include <iostream> #include <string> #include <array> #include "myArray.hpp" using namespace std; /* array:定長陣列 1.array的基本操作 2.array操作自定義型別 3.簡單模擬一下array的實現 */ //1.基本操作 void testCreateArray() { array<double, 2> a; array<int, 3> arr = { 1,2,3 }; } void useArray() { array<string, 3> arr; arr[0] = "Hello"; arr[1] = "Hi"; arr[2] = "!"; for (string str : arr) { cout << str << "\t"; } cout << endl; for (int i = 0; i < arr.size(); i++) { cout << arr[i] << "\t"; } cout << endl; //內建迭代器遍歷 array<string, 3>::iterator iter; for (iter = arr.begin(); iter != arr.end(); iter++) { cout << *iter << "\t"; } cout << endl; //at方法 for (int i = 0; i < arr.size(); i++) { cout <<arr.at(i) << "\t"; } cout << endl; } void arrayFunc() { array<int, 3> Num = { 1,2,3 }; cout << Num.size() << endl; cout << Num.empty() << endl; cout << Num.front() << endl; cout << Num.at(0) << endl; cout << Num.back() << endl; int iNum[3] = { 1,2,3 }; //assign 在 c + + 11 中已過時,替換為 fill 。 替換所有元素。 array<int, 3> Data; Data.fill(3); for (auto v : Data) { cout << v << "\t"; } cout << endl; } //類物件 就是一個數據,所以資料可以做的它都可以 //當做函式引數 //當做函式返回值 //當做類的資料成員也是可以 template <class T, unsigned int size> void print(array<T, size>& str) { for (auto v : str) { cout << v << "\t"; } cout << endl; } void testParamer() { array<string, 3> str = { "ABC","CAD","DGG" }; //顯示呼叫 print<string, 3>(str); //隱式呼叫 print(str); } //2.操作自定義, 無非就是過載 class MM { public: MM() {}; MM(string name, int age) :name(name), age(age) {} string getName() { return name; } int getAge() { return age; } friend ostream& operator<<(ostream& out, const MM& object); protected: string name; int age; }; ostream& operator<<(ostream& out, const MM& object) { out << object.name << "\t" << object.age <<endl; return out; } void arraySaveUserData() { array<MM, 3> mmData; mmData[0] = MM("mm1", 18); mmData[1] = MM("mm2", 20); mmData[2] = MM("mm3", 30); print<MM, 3>(mmData); cout << endl; for (auto v : mmData) { cout << v.getName() << "\t" << v.getAge() << endl; } for (int i = 0; i < mmData.size(); i++) { cout << mmData[i].getName() << "\t" << mmData[i].getAge() << endl; } } void testMyArray() { MyArray<string, 3> strData; //直接當做陣列使用 strData[0] = "ILoveyou"; strData[1] = "Imiisyou"; //strData[3] = "IMiis"; 越界 strData[2] = "IMiis"; for (int i = 0; i < strData.size(); i++) { cout << strData[i] << "\t"; } cout << endl; //新的for迴圈 for (auto v : strData) { cout << v << "\t"; } cout << endl; //內建迭代器遍歷 MyArray<string, 3>::iterator iter; for (iter = strData.begin(); iter != strData.end(); iter++) { cout << *iter << "\t"; } }