很好,无论你是在一天中的什么时候阅读到这篇文章!
我一直在尝试实现我自己版本的类似 std::deque 的容器。我认为可以使用模板来定制内部数组“blocks”的大小和类型,但我似乎无法获得正确的语法。或者至少我认为我正在做的事情在某种程度上是可能的。
template<typename T, int ChunkSize>
class ChunkList
{
public:
ChunkList()
{
T first[ChunkSize] = new T[ChunkSize];
// error: array must be initialized with a brace-enclosed initializer
m_ChunkPointers.push_back(first);
}
private:
// store pointers to the chunks
std::vector<T[]> m_ChunkPointers;
};
int main()
{
ChunkList<int, 4> cl = new ChunkList<int, 4>();
}
// compiled with g++ on a windows x64 machine
我找到了一个与brace-enclosed initializer
相关的Stack Overflow answer,但我不知道如何使用模板语法初始化它们。
我能想到的唯一其他解决方案是使用类似malloc(sizeof(T) * ChunkSize)
的东西,然后将其转换为T[]或其他东西。
无论哪种方式,任何帮助/建议都将非常感谢,总是乐于学习新东西!
PS:即使有一种更有效的解决方案,我仍然想知道是否有一种方法可以使模板按照我在这里想要的方式运行,或者更确切地说,为什么这是无效的。
2条答案
按热度按时间kyvafyod1#
我们有一些问题。
1:在main中,您写入了
ChunkList<int, 4> cl = new ChunkList<int, 4>();
这将不起作用,因为new
将返回ChunkList*
而不是ChunkList
。如果需要对象或指向对象的指针,则需要根据hact写入ChunkList<int, 4>* cl = new ChunkList<int, 4>();
或ChunkList<int, 4> cl{};
2:
std::vector<T[]> m_ChunkPointers;
声明了一个空数组的向量。我想你应该写std::vector<T*> m_ChunkPointers;
来存储指针(指向数组的开始)。3:
T first[ChunkSize] = new T[ChunkSize];
必须为T *first = new T[ChunkSize];
你混合了
T x[N];
sintax和T*x=new T[N];
语法。第一个将在堆栈上创建一个数组,第二个将创建一个数组,在堆上生存到函数的结尾,在你检测到它之前生存。注意:欢迎使用C++。在C++中,变量是对象本身,而不是引用/指针。你需要管理对象在堆中的生存期。如果你不想删除你使用过的每个对象,我建议你看看
unique_ptr
和shared_ptr
pcww981p2#
您已经在使用
std::vector
,为什么不为这些块也提供一个合适的容器呢?// store pointers to the chunks
-您不想存储指针,您想存储数组。您试图将它们存储在堆上,但这种复杂性是完全不必要的,因为它们是固定大小的,并且std::vector
已经在动态分配的内存中管理其元素。