C++ STL---vector

mac2022-06-30  28

vector

vector容器是一个动态的顺序表,支持像数组一样随机访问,[]访问,但是vector容器在erase与insert的时候比较费劲,需要另外申请空间,而且这个现象还可能导致迭代器失效的问题,因此如果我们在erase与insert之后还想用迭代器的话,就必须将他们的返回值接收下来,然后才能继续使用

vector相关使用

1.vector构造函数

无参构造拷贝构造使用迭代器进行初始化构造构造n个val

2.vector的空间增长问题

size:vector的中数据的数量capacity:vector的容量的大小empty:判断容器是否为空resize:重新分配空间,会进行初始化,会改变sizereserve:重新分配容量,改变的是capacity

3.vector的增删查改

push_back:尾插pop_back:尾删find:查找并且返回位置insert:插入erase:删除swap:交换两个容器的空间operator []:中括号访问 #pragma once namespace ljc { template<class T> class vector { T * m_start; T * m_finish; T * m_endOfStroge; public: //vector的迭代器是一个原生指针 typedef T * iterator; typedef const T * const_iterator; vector() : m_start(nullptr), m_finish(nullptr), m_endOfStroge(nullptr) { } //默认的val为0 vector(int n, const T &val = T()) : m_start(nullptr), m_finish(nullptr), m_endOfStroge(nullptr) { reserve(n); for (int i = 0; i < n; i++) { m_start[i] = val; } m_finish = m_start + n; } vector(T * start, T * end) : m_start(nullptr), m_finish(nullptr), m_endOfStroge(nullptr) { int _size = end - start; reserve(_size); for (int i = 0; i < _size; i++) { m_start[i] = start[i]; } m_finish = m_start + _size; } iterator begin() { return m_start; } iterator end() { return m_finish; } size_t size() { return m_finish - m_start; } size_t capacity() { return m_endOfStroge - m_start; } T & operator [] (int i) { return m_start[i]; } const T & operator [] (int i) const { return m_start[i]; } void reserve(size_t _size) { int _capacity = capacity(); if (_capacity < _size) { if (_capacity == 0) { _capacity = 1; } while (_capacity < _size) { _capacity *= 2; } } T * tmp = new T[_capacity]; m_endOfStroge = tmp + _capacity; int oldsize = size(); m_finish = tmp + oldsize; if (m_start != nullptr) { for (int i = 0; i < oldsize; i++) { tmp[i] = m_start[i]; } delete[] m_start; } m_start = tmp; } void resize(size_t size, const T &val = T()) { reverse(_size); for (int i = size(); i < _size; i++) { m_start[i] = val; } m_finish = m_start + _size; } iterator insert(iterator pos, const T &val) { int tmp = pos - m_start; reserve(size() + 1); pos = m_start + tmp; int i; for (i = size() - 1; i >= pos - m_start; i--) { m_start[i + 1] = m_start[i]; } *pos = val; m_finish++; return pos; } iterator insert(iterator pos, int n, const T &val) { int tmp = pos - m_start; reserve(size() + n); pos = m_start + tmp; int i; for (i = size() - 1; i >= pos - m_start; i--) { m_start[i + n] = m_start[i]; } for (i = 0; i < n; i++) { pos[i] = val; } m_finish += n; return pos; } iterator insert(iterator pos, const T * start, const T * end) { int tmp = pos - m_start; int extsize = end - start; reserve(size() + extsize); pos = m_start + tmp; int i; for (i = size() - 1; i >= pos - m_start; i--) { m_start[i + extsize] = m_start[i]; } for (i = 0; i < extsize; i++) { pos[i] = start[i]; } m_finish += extsize; return pos; } iterator erase(iterator pos) { int i; for (i = pos - m_start; i < size() - 1; i++) { m_start[i] = m_start[i + 1]; } m_finish--; return pos; } iterator erase(iterator start, iterator end) { int i; int extsize = end - start; for (i = start - m_start; i < size() - extsize; i++) { m_start[i] = m_start[i + extsize]; } m_finish -= extsize; return start; } void push_back(const T &val) { reserve(size() + 1); *m_finish = val; m_finish++; } void pop_back() { m_finish--; } }; };
最新回复(0)