用C++实现增量数组
Implementing incremental array in C++
我想要实现一个数组,该数组可以随着新值的添加而递增。就像在Java中一样。我不知道该怎么做。有人能给我一条路吗?
这是为了学习,所以我不能使用std::vector
。
这里有一个起点:您只需要三个变量,nelems
、capacity
和一个指向实际数组的指针。所以,你的课一开始就是
class dyn_array
{
T *data;
size_t nelems, capacity;
};
其中T
是要存储的数据类型;要获得额外学分,请将其作为模板类。现在,在动态数组上实现课本或维基百科页面上讨论的算法。
请注意,new
/delete
分配机制不支持像C的realloc
那样增长阵列,因此在增长容量时,实际上会移动data
的内容。
我想借此机会让您对一个有趣但有些困难的主题感兴趣:异常。
- 如果你开始自己分配内存,然后使用原始指针,你会发现自己很难避免内存泄漏
- 即使您将内存的记账委托给一个正确的类(比如
std::unique_ptr<char[]>
),您仍然必须确保更改对象的操作在失败时使其处于一致的状态
例如,这里有一个简单的类,它有一个不正确的resize
方法(这是大多数代码的核心):
template <typename T>
class DynamicArray {
public:
// Constructor
DynamicArray(): size(0), capacity(0), buffer(0) {}
// Destructor
~DynamicArray() {
if (buffer == 0) { return; }
for(size_t i = 0; i != size; ++i) {
T* t = buffer + i;
t->~T();
}
free(buffer); // using delete[] would require all objects to be built
}
private:
size_t size;
size_t capacity;
T* buffer;
};
好吧,这就是简单的部分(尽管已经有点棘手了)。
现在,你如何在末尾添加一个新元素?
template <typename T>
void DynamicArray<T>::resize(size_t n) {
// The *easy* case
if (n <= size) {
for (; n < size; ++n) {
(buffer + n)->~T();
}
size = n;
return;
}
// The *hard* case
// new size
size_t const oldsize = size;
size = n;
// new capacity
if (capacity == 0) { capacity = 1; }
while (capacity < n) { capacity *= 2; }
// new buffer (copied)
try {
T* newbuffer = (T*)malloc(capacity*sizeof(T));
// copy
for (size_t i = 0; i != oldsize; ++i) {
new (newbuffer + i) T(*(buffer + i));
}
free(buffer)
buffer = newbuffer;
} catch(...) {
free(newbuffer);
throw;
}
}
感觉对不对?
我的意思是,我们甚至处理了T
的复制构造函数可能引发的异常!是 啊
不过,请注意我们遇到的一个微妙问题:如果抛出异常,我们已经更改了size
和capacity
成员,但仍然有旧的buffer
。
当然,修复是显而易见的:我们应该首先更改缓冲区,然后更改大小和容量。当然
但要把它做好是"困难的"。
我建议使用另一种方法:创建一个不可变的数组类(容量应该是不可变的,而不是其余的),并实现一个无异常的swap
方法。
然后,您将能够更容易地实现"类事务"语义。
当我们添加元素时动态增长的数组称为动态数组、可增长数组,这里是动态数组的完整实现。
在C和C++中,数组表示法基本上只是短指针数学。所以在这个例子中。
int fib [] = { 1, 1, 2, 3, 5, 8, 13};
此:
int position5 = fib[5];
这和说是一样的吗
int position5 = int(char*(fib)) + (5 * sizeof(int));
所以基本上数组只是指针。
因此,如果你想自动分配,你需要编写一些包装函数来调用malloc()或new(分别是C和C++)。
尽管你可能会发现矢量是你正在寻找的。。。
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- C++ 使用数组实现堆栈
- 使用 C++ STL 的数组实现
- 为自定义数组实现迭代器
- 二进制搜索树的数组实现
- Boyer Moore 动态数组实现
- 为什么这个普通的数组实现比STD ::向量实现性能慢
- 通过访问二维数组实现双线性插值的概念类似于一维数组
- 通过数组实现BST,通过链表实现堆
- 可以使用 1D 数组实现 0-1 背包吗?
- 使用循环数组实现矢量
- 使用链表数组实现哈希表
- 队列的数组实现:奇怪的输出
- 如何使用指针数组实现节点
- 使用数组实现一个简单的队列
- 多维数组实现
- 堆栈的数组实现
- IntSet数组实现
- 用字符数组实现BigInteger的上限是多少?
- 链表vs.动态数组实现一副牌?c++