1. 程式人生 > 其它 >C++第10課 STL容器 (一)

C++第10課 STL容器 (一)

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() { return
memory; } 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";
    }
}