原来是悟净 2022-03-16 09:35 采纳率: 100%
浏览 39
已结题

vector的实现出现的问题??

求帮忙看下哪里出现了问题??

img


#ifndef VECTOR_H
#define VECTOR_H

#include <iostream>
#include <memory>
#include <cstdlib>
#include <cstring>

//默认容量
const int default_capacity = 20;

template <class T>
class Vector
{
public:
  Vector() : m_capacity_(default_capacity), m_size_(0), m_ptr_(nullptr)
  {
  
  }

  Vector(int size, T data) : m_size_(size)
  {
    this->m_capacity_ = default_capacity + size;
    this->m_ptr_ = new T[this->m_capacity_];

    for (int i = 0; i < this->m_size_; ++i)
    {
      this->m_ptr_[i] = data;
    }
  }

  Vector(const Vector& v)
  {
    this->m_ptr_ = new T[v.m_size_];
    this->m_size_ = v.m_size_;
    this->m_capacity_ = default_capacity + v.m_capacity_;
    for (int i = 0; i < this->m_size_; ++i)
    {
      this->m_ptr_[i] = v.m_ptr_[i];
    }
  }

  ~Vector()
  {
    if (this->m_ptr_ != nullptr)
    {
      delete[] m_ptr_;
    }
    std::cout << "destory" << std::endl;
  }

  int size()
  {
    return this->m_size_;
  }

  T& operator[](int index)
  {
    return this->m_ptr_[index];
  }

  Vector& operator= (const Vector<T>& v)
  {
    if (this->m_ptr_ != nullptr)
    {
      delete[] this->m_ptr_;
      this->m_ptr_ = nullptr;
      this->m_capacity_ = 0;
      this->m_size_ = 0;
    }
    this->m_capacity_ = v.m_capacity_;
    this->m_size_ = v.m_size_;

    this->m_ptr_ = new T[this->m_capacity_];
    memcpy(this->m_ptr_, v.m_ptr_, this->m_size_ * sizeof(T));
    return *this;
  }

  void push_back(T data)
  {
    if (this->m_ptr_ == nullptr)
    {
      this->m_capacity_ = default_capacity;
      this->m_size_ = 0;
      this->m_ptr_ = new T[this->m_capacity_];
    }
    // 预留空间大小,当原容量小于要求大小时,才会重新分配
    if (this->m_size_ >= this->m_capacity_)
    {
      T* new_p = new T[this->m_capacity_ * 2];
      memcpy(new_p, this->m_ptr_, this->m_size_ * sizeof(T));
      this->m_capacity_ *= 2;
      delete[]this->m_ptr_;
      this->m_ptr_ = new_p;
    }
    this->m_ptr_[this->m_size_++] = data;
  }

  void pop_back()
  {
    if (this->m_size_ >= 1)
    {
      this->m_size_--;
    }
  }

private:
  int m_size_;
  int m_capacity_;
  T*  m_ptr_;

};



#endif // !VECTOR_H


```c++
#include "vector.h"

#include <iostream>

int main()
{
  Vector<int> p1;
  Vector<int> p2(3,1);
  Vector<int> p3(p1);
  Vector<int> p4 = p2;

  auto vector = p1;

  vector.push_back(1);
  //vector.push_back(2);

  for (int i = 0; i < vector.size(); i++)
  {
    std::cout << vector[i] << std::endl;
  }

  std::cout << p2.size() << std::endl;
  std::cout << vector.size() << std::endl;
  vector.pop_back();
  std::cout << vector.size() << std::endl;


}

```

  • 写回答

2条回答 默认 最新

  • yun6853992 2022-03-16 09:59
    关注

    代码没有问题 就是笔误,应该是这里拷贝构造函数申请内存大小的问题,和push_back时塞数据冲突了。
    看下面的图就好,不好意思,很久不接触C++,顺路回顾了一下,过程中可能有错误的理解,你谨慎参考,参考下面
    主要就是复制构造函数,以及重载=的逻辑,你实现没问题,笔误导致的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 修改了问题 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?