六、STL容器:mySTL

2023-11-18

6 mySTL

6.1 复数类模板

  • complex<>
    include/Complex.h
    Test/complextest.cpp

6.2 容器

6.2.1 顺序容器

  • vector<>
  • list<>
  • deque<>
  • valarray<>

6.2.2 关联容器

  • pair<>
  • set<>
  • multiset<>
  • bitset<>
  • map<>
  • multimap<>

2.3 容器迭代器

  • stack<>
  • queue<>
  • priority_queuetest<>

6.3 算法

fill()fill_n()generate()generate_n()min()max()for_each()find()find_if()count()count_if()equal()advance()distance()copy()

6.5 实例

#include <iostream>
#include <vector>
using namespace std;
namespace mySTL {
template <typename T>
class vector {
public:
    typedef T data_type;
    typedef T& reference;
    typedef const T& const_reference;
    typedef T* pointer;
    typedef const T* const_pointer;
    typedef size_t size_type;
    typedef pointer iterator;
    typedef const_pointer const_iterator;

private:
    pointer m_pstart;
    pointer m_pend;  //size = m_pstart - m_pend;
    pointer m_pcapacity; //capacity = m_pcapacity - m_pstart;
public:
    vector():m_pstart(nullptr),m_pend(nullptr),m_pcapacity(nullptr) {}
    vector(size_type n) {}
    vector(size_type n,const_reference element) {}
    vector(const vector& vec) {}
    vector& operator==(const vector& vec) {
        return *this;
    }
    bool operator==(const vector& vec)const {
        return false;
    }
    data_type& operator[](size_type index) {
        return m_pstart[index];
    }
    const data_type& operator[](size_type index)const {
        return m_pstart[index];
    }
    ~vector() {}

    size_type size() {
        return m_pend-m_pstart;
    }
    size_type capacity() {
        return m_pcapacity-m_pstart;
    }
    bool empty(){
        return size() == 0;
    }
    void push_back(const_reference element) {
        if(empty()) {
            m_pstart = new data_type[1];
            m_pstart[0] = element;
            m_pend = m_pstart+1;
            m_pcapacity = m_pend;
        } else {
            size_type nsize = size();
            size_type ncapacity = capacity();
            if(m_pend == m_pcapacity) {
                pointer temp = new data_type[ncapacity*2];
                for(int i = 0; i < nsize; ++i) {
                    temp[i] = m_pstart[i];
                }
                delete [] m_pstart;
                m_pstart = temp;
                m_pcapacity = m_pstart+ncapacity*2;
            }
            m_pstart[nsize] = element;
            m_pend = m_pstart+nsize+1;
        }
    }
    void pop_back(const_reference element) {}
    iterator begin() {
        return m_pstart;
    }
    iterator end() {
        return m_pend;
    }
    const_iterator begin()const {
        return m_pstart;
    }
    const_iterator end()const {
        return m_pend;
    }
};
template <typename It,typename T>
T accumulate(It first,It last,T initVal) {
    T res = initVal;
    for(It it = first; it!=last; ++it) {
        res+=*it;
    }
    return res;
}

template <typename T>
typename T::data_type sum(const T& container) {
    typename T::data_type res{};
    for(auto n:container) {
        res+=n;
    }
    return res;
}
};

int main() {
    mySTL::vector<int>::data_type element;
    mySTL::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);

    cout << vec.size() << endl;
    cout << vec.capacity() << endl;

    mySTL::vector<int>::iterator it = vec.begin();
    while(it != vec.end()){
    	cout << *it++ << " ";
    }
    cout << endl;

    for(auto n:vec){
    	cout << n << " ";
    }
    cout << endl;

    cout << vec[2] << endl;
    cout << mySTL::accumulate(vec.begin(),vec.end(),0) << endl;
    cout << mySTL::sum(vec) << endl;
}
4
4
1 2 3 4 
1 2 3 4 
3
10
10

注:目前仅能实现vectorpush_back()、下标访问、循环打印、sum(),更多功能持续开发中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

六、STL容器:mySTL 的相关文章

随机推荐