自定义 Vector/Dynamic 数组 C++ 问题
Custom Vector/Dynamic Array C++ issue
我正在尝试用 C++ 制作我自己的矢量,以便我可以更多地了解它是如何工作的!
这是代码:
#pragma once
template<typename T>
class Vector {
public:
Vector() {
// allocate 2 elements
ReAlloc(2);
}
void pushBack(const T& value) {
if (m_Size >= m_Capacity) {
ReAlloc(m_Capacity / 2);
}
m_Data[m_Size++] = value;
}
const T& operator[](size_t index) const {
/*
if (index >= m_Size) {
// assert
}
*/
return m_Data[index];
}
T& operator[](size_t index) {
/*
if (index >= m_Size) {
// assert
}
*/
return m_Data[index];
}
const size_t Size() const { return m_Size; }
size_t Size() { return m_Size; }
private:
T* m_Data = nullptr;
size_t m_Size = 0;
size_t m_Capacity = 0;
private:
void ReAlloc(size_t newCapacity) {
// 1. allocate a new block of memory
// 2. copy/move old elements into the new block
// 3. delete the old one
T* newBlock = new T[newCapacity];
if (newCapacity < m_Size) {
m_Size = newCapacity;
}
for (size_t i = 0; i < m_Size; i++) {
newBlock[i] = m_Data[i];
}
delete[] m_Data;
m_Data = newBlock;
m_Capacity = newCapacity;
}
};
但是,当我尝试像这样从 main.cpp 使用它时:
#include <iostream>
#include <string>
#include "Vector.h"
#define print(x) std::cout << x
#define println(x) std::cout << x << std::endl
template<typename T>
void PrintVector(Vector<T>& vector) {
for (size_t i = 0; i < vector.Size(); i++) {
println(vector[i]);
}
println("------------------------------------------");
}
int main() {
Vector<std::string> vector;
vector.pushBack("Ahmed");
vector.pushBack("C++");
vector.pushBack("Vector");
PrintVector(vector);
}
代码给我这个输出:
Ahmed
Vector
------------------------------------------
(process 7540) exited with code -1073740940.
它甚至不打印 C++,而且代码表现得很奇怪,每当我尝试更改任何内容时,输出变得更加混乱,请问有人能告诉我我做错了什么吗?!。
谢谢 ! :)
在您的 pushBack
函数中,当大小大于或等于容量时,您正在做:
ReAlloc(m_Capacity / 2);
这没有意义。如果你需要额外的space来添加元素,你应该增加底层数组的容量,而不是减少一半。
您可能正在寻找:
ReAlloc(m_Capacity * 2);
使基础容量翻倍。
这是一个可以正常工作的 demo,没有任何段错误。
我正在尝试用 C++ 制作我自己的矢量,以便我可以更多地了解它是如何工作的! 这是代码:
#pragma once
template<typename T>
class Vector {
public:
Vector() {
// allocate 2 elements
ReAlloc(2);
}
void pushBack(const T& value) {
if (m_Size >= m_Capacity) {
ReAlloc(m_Capacity / 2);
}
m_Data[m_Size++] = value;
}
const T& operator[](size_t index) const {
/*
if (index >= m_Size) {
// assert
}
*/
return m_Data[index];
}
T& operator[](size_t index) {
/*
if (index >= m_Size) {
// assert
}
*/
return m_Data[index];
}
const size_t Size() const { return m_Size; }
size_t Size() { return m_Size; }
private:
T* m_Data = nullptr;
size_t m_Size = 0;
size_t m_Capacity = 0;
private:
void ReAlloc(size_t newCapacity) {
// 1. allocate a new block of memory
// 2. copy/move old elements into the new block
// 3. delete the old one
T* newBlock = new T[newCapacity];
if (newCapacity < m_Size) {
m_Size = newCapacity;
}
for (size_t i = 0; i < m_Size; i++) {
newBlock[i] = m_Data[i];
}
delete[] m_Data;
m_Data = newBlock;
m_Capacity = newCapacity;
}
};
但是,当我尝试像这样从 main.cpp 使用它时:
#include <iostream>
#include <string>
#include "Vector.h"
#define print(x) std::cout << x
#define println(x) std::cout << x << std::endl
template<typename T>
void PrintVector(Vector<T>& vector) {
for (size_t i = 0; i < vector.Size(); i++) {
println(vector[i]);
}
println("------------------------------------------");
}
int main() {
Vector<std::string> vector;
vector.pushBack("Ahmed");
vector.pushBack("C++");
vector.pushBack("Vector");
PrintVector(vector);
}
代码给我这个输出:
Ahmed
Vector
------------------------------------------
(process 7540) exited with code -1073740940.
它甚至不打印 C++,而且代码表现得很奇怪,每当我尝试更改任何内容时,输出变得更加混乱,请问有人能告诉我我做错了什么吗?!。 谢谢 ! :)
在您的 pushBack
函数中,当大小大于或等于容量时,您正在做:
ReAlloc(m_Capacity / 2);
这没有意义。如果你需要额外的space来添加元素,你应该增加底层数组的容量,而不是减少一半。
您可能正在寻找:
ReAlloc(m_Capacity * 2);
使基础容量翻倍。
这是一个可以正常工作的 demo,没有任何段错误。