【发布时间】:2020-11-17 22:33:13
【问题描述】:
条件
在讲座中,我们已经开始实现我们的向量。在此任务中,您需要开发它:添加Size、Capacity 和PushBack 方法。发送包含SimpleVector类模板声明和定义的simple_vector.h头文件进行验证:
要求:
-
Capacity方法应返回向量的当前容量 — 适合向量当前分配的内存块的元素数 -
Size方法必须返回向量中的元素数 -
PushBack方法在向量末尾添加一个新元素;如果当前分配的内存块(即Size() == Capacity())中没有剩余空间,向量必须分配一个大小为2 * Capacity()的块,将所有元素复制到其中,并删除旧的。 - 对于新创建的对象,第一次调用
PushBack方法必须使容量等于 1 -
Push Back方法必须具有摊销常数复杂度 -
begin和end方法必须返回迭代器当前向量的开始和结束 向量分配的当前内存块必须在析构函数中释放 - 另请参阅随附的解决方案模板,了解在单元测试中使用
SimpleVector的其他要求。
决定的准备:
评论:
您发送用于验证的头文件不应包含<vector>、<list>、<forward_list>、<deque>、<map> 文件。如果您启用了这些文件之一,您将收到编译错误。
提示:
当然,SimpleVector 类模板的实现将有一个指针字段。在默认构造函数中,您需要使用一些东西对其进行初始化。在讲座中,我们只讨论了一种初始化指针的方法——使用 new 运算符。在 C++ 中,有一个特殊的值,表示一个不指向任何内容的指针——nullptr:
int* p = nullptr;
string* q = nullptr;
map<string, vector<int>>* r = nullptr;
可以在默认构造函数中使用nullptr来初始化指针。
如何发送: 工作准备就绪后,您可以在“我的工作”选项卡上为任务的每个部分上传文件。
这是我的.hsolution,Coursera 测试系统会回复10 != 8: Memory leak detected。但是我无法弄清楚泄漏的去向。请帮帮我。
#pragma once
#include <cstdlib>
using namespace std;
template <typename T>
class SimpleVector {
public:
SimpleVector()
: data(nullptr)
, end_(data)
, size_(0) {}
explicit SimpleVector(size_t size)
: data(new T[size])
, end_(data + size)
, size_(size) {}
~SimpleVector() {
delete[] data;
}
T& operator[](size_t index) { return data[index]; }
T* begin() const { return data; }
T* end() const { return end_; }
size_t Capacity() const { return end_ - data; }
size_t Size() const { return size_; }
void PushBack(const T& value) {
if (size_ == Capacity()) {
if (size_ == 0) {
delete[] data;
data = new T[1];
data[size_] = value;
++size_;
end_ = data + size_;
}
else {
T* local_data = new T[size_];
for (size_t i = 0; i < size_; ++i) {
local_data[i] = data[i];
}
delete[] data;
data = new T[2 * Capacity()];
for (size_t i =0; i < size_; ++i) {
data[i] = local_data[i];
}
delete[] local_data;
data[size_] = value;
++size_;
end_ = data + size_ * 2;
}
}
else {
data[size_] = value;
size_++;
}
}
private:
T *data;
T *end_;
size_t size_;
};
谢谢提前。
【问题讨论】:
-
你的班级违反了3/5/0的规则:https://en.cppreference.com/w/cpp/language/rule_of_three
-
如果您使用带有非零参数的
SimpleVector(size_t size)构造函数,那么size_ == Capacity()将为真,即使不需要,您也将重新分配内存。 -
使用 unique_ptr.
-
@cigien 是的,我知道如何使用调试器,但在这种情况下它并不能帮助我找到错误
-
在您的 PushBack 中,您不需要分配 2 个缓冲区并复制两次。