意思就是自己用代码模拟Vector向量的使用,包括它的添加数据,删除数据和查询数据方法
#include <algorithm>
#include <iostream>
template <class T>
#define DEFAULT_SIZE 4
class Vector
{
private:
long size;
long capacity;
T *elements;
public:
// 默认构造函数
Vector()
{
std::cout<<"call default constructor"<<std::endl;
size = 0;
capacity = DEFAULT_SIZE;
elements = new T[capacity];
}
// 五大函数
// 析构函数
~Vector()
{
std::cout<<"call destructor"<<std::endl;
size = 0;
capacity = 0;
delete[] elements;
}
// 拷贝构造函数
Vector(const Vector &ref) : size{ref.size}, capacity{ref.capacity}
{
std::cout <<"call copy constructor"<<std::endl;
elements = new T[size];
for (long i = 0; i != size; ++i)
{
elements[i] = ref.elements[i];
}
}
// 移动构造函数
Vector(Vector &&ref) : size{ref.size}, capacity{ref.capacity}, elements{ref.elements}
{
std::cout <<"call move constructor"<<std::endl;
ref.size = 0;
ref.capacity = 0;
ref.elements = nullptr;
}
// 拷贝赋值
Vector &operator=(const Vector &ref)
{
std::cout <<"call copy assignment"<<std::endl;
Vector copy = ref;
// swap会调用一个移动构造,两次移动赋值
// swap的内部实现如下
// __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
// _Tp __tmp = _GLIBCXX_MOVE(__a);
// __a = _GLIBCXX_MOVE(__b);
// __b = _GLIBCXX_MOVE(__tmp);
std::swap(*this, copy);
return *this;
}
// 移动赋值
Vector &operator=(Vector &&ref)
{
std::cout <<"call move assignment"<<std::endl;
std::swap(size, ref.size);
std::swap(capacity, ref.capacity);
std::swap(elements, ref.elements);
return *this;
}
// 修改size
void resize(long new_size)
{
if (new_size < 0)
{
return;
}
// 如果容量不够,则开辟更大的内存区域,开辟时保持capacity是size的两倍
if (new_size > capacity)
{
reserve(new_size * 2);
}
size = new_size;
}
// 修改容量
void reserve(int new_capacity)
{
if (new_capacity <= capacity)
{
return;
}
T *new_elements = new T[new_capacity];
for (long i = 0; i != size; ++i)
{
new_elements[i] = std::move(elements[i]);
}
std::swap(new_elements, elements);
delete[] new_elements;
capacity = new_capacity;
}
// 重载[]运算符
T &operator[](long index)
{
if (index < 0 || index >= size)
{
return nullptr;
}
return elements[index];
}
// 返回size
long get_size() const
{
return size;
}
bool empty() const
{
return size == 0;
}
void clear()
{
std::cout<<"clear"<<std::endl;
size = 0;
}
void push_back(const T &element)
{
std::cout<<"call push_back with lvalue"<<std::endl;
if (size == capacity)
{
reserve(size * 2);
}
elements[size++] = element;
}
void push_back(T &&element){
std::cout<<"call push_back with rvalue"<<std::endl;
if (size == capacity)
{
reserve(size * 2);
}
elements[size++] = std::move(element);
}
void pop_back()
{
if(size == 0){
return;
}
size--;
}
T &back()
{
if (size == 0)
{
return elements[0];
}
return elements[size - 1];
}
typedef T *iterator;
typedef const T *const_iterator;
iterator begin()
{
return &elements[0];
}
const_iterator const_begin()
{
return &elements[0];
}
iterator end()
{
return &elements[get_size()];
}
const_iterator const_end()
{
return &elements[get_size()];
}
};
template<class T>
void print_vector(Vector<T>& vector);
template<class T>
void print_vector(Vector<T>& vector){
for(auto it_begin = vector.const_begin(); it_begin != vector.const_end(); ++it_begin)
{
std::cout<<"value is "<< *it_begin <<std::endl;
}
}
int main()
{
Vector<int> vector1;
std::cout << "size of vector1 " << vector1.get_size() << std::endl;
vector1.push_back(1);
std::cout << "push_back 1" << std::endl;
std::cout << "size of vector1 " << vector1.get_size() << std::endl;
int temp = vector1.back();
vector1.pop_back();
std::cout << "pop_back" << std::endl;
std::cout << "value of temp " << temp << std::endl;
std::cout << "size of vector1 " << vector1.get_size() << std::endl;
vector1.pop_back();
std::cout << "pop_back" << std::endl;
std::cout << "size of vector1 " << vector1.get_size() << std::endl;
vector1.push_back(1);
vector1.push_back(2);
vector1.push_back(3);
vector1.push_back(4);
vector1.push_back(5);
const Vector<int> & c_vector1 = vector1;
print_vector(vector1);
Vector<int>::iterator iter_begin = vector1.begin();
*iter_begin = 10;
std::cout << "change first element of vector1"<< std::endl;
print_vector(vector1);
std::cout << "move vector1 to vector2 " << std::endl;
Vector<int> vector2;
vector2 = vector1;
std::cout << "size of vector1 " << vector1.get_size() << std::endl;
print_vector(vector1);
std::cout << "size of vector2 " << vector2.get_size() << std::endl;
print_vector(vector2);
vector2.clear();
vector2.push_back(1);
const int &lvalue = 2;
vector2.push_back(lvalue);
print_vector(vector2);
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632