明天面试,半夜睡不着复习下STL底层实现

本文详细介绍了C++中四种基础数据结构的实现:字符串类,使用动态内存管理;向量类,具备动态大小调整功能;双向链表结构的节点类;以及栈和队列的简单实现,分别基于向量和列表。这些数据结构是编程中常用的基础工具,理解其内部工作原理有助于提升编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序列容器

1.string

class string{
  string(const char* str = ""){
    if(str == nulptr){
      assert(false);
      return;
    }
    _str = new char[strlen(str) + 1];
    strcpy(_str,str);
    }

    string(const string& s)
      :_str(new char[strlen(s._str)+1])
    {
      strcpy(_str,s._str);
    }

    string& operator=(const string& s)
    {
      if(this != &s)
      {
        char* pstr = new char[strlen(s._str)+1];
        strcpy(pstr,s._str);
        delete[] _str;
        _str = pstr;
      }
      return *this;
    }

    ~string()
    {
      if(_str)
      {
        delete[] _str;
        _str = nullptr;
      }
    }

private:
  char* _str;
}

2.vector

是可变大小的数组

template<class T>
class vector
{
private:
iterator _start;
iterator _finish;
iterator _endofstorage;
public:
typedef T* iterator;
typedef const T* const_iterator;

iterator begin(){return _begin;}
iterator end(){return _finish;}
const_iterator cbegin()const{return _begin};
const_iterator cend()const{return _finish;}

vector()
  :_start(nullptr)
  ,_finish(nullptr)
  ,endofstorage(nullptr)
{}

vector(int n,const T& value = T())
  :_start(nullptr)
  ,_finish(nullptr)
  ,endofstorage(nullptr)
{
  reserve(n);
  while(n--)
  {
    push_back(value);
  }
}

vector(iterator first,iterator last)
{
  reserve(last - first);
  while(first != last)
  {
    push_back(*first);
    ++first;
  }
}

vector(const vector<T>& v)
  :_start(nullptr)
  ,_finish(nullptr)
  ,endofstorage(nullptr)
{
  reserve(v.capacity());
  iterator it = begin();
  const_iterator vit = v.cbegin();
  while(vit != v.cend())
  {
    *it++ = *vit++;
  }
}
vector<T>& operator=(vector<T>v)
{
  swap(v);
  return *this;
}

~vector()
{
  delete[] _start;
  _start = _finish = _endofstrage;
}

size_t size()const{return _finish - _start;}
size_t capacity()const{return _endofstrage - _start;}
bool empty()const{return _first = _finish;}

void reserve(size_t n)
{
  if(n>capacity())
  {
    

  }
}





};

3.list

底层是双向链表结构

template<class T>
struct ListNode
{
ListNode(const T& val)
  :_val(val)
  ,pPre(nullptr)
  ,_pNext(nullptr)
{}


T _val;
ListNode<T>* _pPre;
ListNode<T>* _pNext;
};

4.stack 

template<class T>
class stack
{
public:
stack(){}
void push(const T& x) {_c.push_back(x);}
void pop() {_c.pop_back();}
T& top() {return _c.back();}
const T& top()const {return _c.back();}
size_t size()const {return _c.size();}
bool empty()const {return _c.empty();}
  
private:
std::vector<T>_c;
};

5.queue队列

队列

template<class T>
class queue
{
public:
queue() {}
void push(const T& x) {_c.push_back(x);}
void pop() {_c.pop_front();}
T& back() {return _c.back();}
const T& back()const {return _c.back();}
T& front() {return _c.front();}
const T& front()const {return _c.front();}
size_t size()const {return _c.size();}
bool empty()const {return _c.empty();}
private:
std::list<T> _c;
};

关联式容器

待续。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学c的长弓狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值