回推功能的容量问题
Issue of capacity in push back function
我遇到了一个问题,试图让初始容量与正确容量相匹配。我一直试图让起始容量从 0 而不是 1 开始(如下图)。但是,我似乎做不到。如果您能告诉我我的代码哪里出了问题,我将不胜感激。提前致谢!
正确输出:
********** TestPush **********
Empty array:
(size=0, capacity=0)
push_back 5 floats:
0 (size=1, capacity=1)
0 1 (size=2, capacity=2)
0 1 2 (size=3, capacity=4)
0 1 2 3 (size=4, capacity=4)
0 1 2 3 4 (size=5, capacity=8)
pop_back until empty:
0 1 2 3 (size=4, capacity=8)
0 1 2 (size=3, capacity=8)
0 1 (size=2, capacity=8)
0 (size=1, capacity=8)
(size=0, capacity=8)
不正确的输出:
********** TestPush **********
Empty array:
(size=0, capacity=1)
push_back 5 floats:
0 (size=1, capacity=1)
0 1 (size=2, capacity=2)
0 1 2 (size=3, capacity=4)
0 1 2 3 (size=4, capacity=4)
0 1 2 3 4 (size=5, capacity=8)
pop_back until empty:
0 1 2 3 (size=4, capacity=8)
0 1 2 (size=3, capacity=8)
0 1 (size=2, capacity=8)
0 (size=1, capacity=8)
(size=0, capacity=8)
我的 .h 文件
template <typename T>
class vector
{
private:
T* v;
int count;
int capacity;
public:
vector(void){
v = new T[capacity];
count = 0;
capacity=0;
capacity++;
}
void push_back(const T& t)
{
if(count+1>capacity)
{
capacity *= 2;
T* newData = new T[capacity];
for(int i=0; i <count; i++)
{
newData[i] = v[i];
}
delete[] v;
v = newData;
}
v[count++] = t;
}
主文件:
void TestPush(void)
{
std::cout << "\n********** TestPush **********\n";
cs150::vector<float> a;
std::cout << "Empty array:\n";
Print(a);
std::cout << "push_back 5 floats:\n";
for (float i = 0; i < 5; i++) {
a.push_back(i);
Print(a);
}
std::cout << "pop_back until empty:\n";
while (!a.empty()) {
a.pop_back();
Print(a);
}
}
嗯,看起来很清楚,这是你的代码
vector(void){
v = new T[capacity];
count = 0;
capacity=0;
capacity++;
}
不要增加容量,而是这样做
vector() {
count = 0;
capacity = 0;
v = new T[capacity];
}
请注意,您必须先设置 capacity
变量,然后再执行 new T[capacity];
void
是不必要的 顺便说一句
现在,由于您的容量比以前少了一个,因此您需要进行一些其他更改
void push_back(const T& t)
{
if(count+1>capacity)
{
capacity *= 2;
变成
void push_back(const T& t)
{
if (count+1>capacity)
{
capacity = std::max(2*capacity, 1);
这样如果之前容量为零,之后容量为1
问题是您在
行中使用了 capacity
v = new T[capacity];
在 capacity
初始化之前。这是未定义行为的原因。
您应该先将 capacity
初始化为大于 0 的值。
vector(void) : count(0), capacity(1)
{
v = new T[capacity];
}
我遇到了一个问题,试图让初始容量与正确容量相匹配。我一直试图让起始容量从 0 而不是 1 开始(如下图)。但是,我似乎做不到。如果您能告诉我我的代码哪里出了问题,我将不胜感激。提前致谢!
正确输出:
********** TestPush **********
Empty array:
(size=0, capacity=0)
push_back 5 floats:
0 (size=1, capacity=1)
0 1 (size=2, capacity=2)
0 1 2 (size=3, capacity=4)
0 1 2 3 (size=4, capacity=4)
0 1 2 3 4 (size=5, capacity=8)
pop_back until empty:
0 1 2 3 (size=4, capacity=8)
0 1 2 (size=3, capacity=8)
0 1 (size=2, capacity=8)
0 (size=1, capacity=8)
(size=0, capacity=8)
不正确的输出:
********** TestPush **********
Empty array:
(size=0, capacity=1)
push_back 5 floats:
0 (size=1, capacity=1)
0 1 (size=2, capacity=2)
0 1 2 (size=3, capacity=4)
0 1 2 3 (size=4, capacity=4)
0 1 2 3 4 (size=5, capacity=8)
pop_back until empty:
0 1 2 3 (size=4, capacity=8)
0 1 2 (size=3, capacity=8)
0 1 (size=2, capacity=8)
0 (size=1, capacity=8)
(size=0, capacity=8)
我的 .h 文件
template <typename T>
class vector
{
private:
T* v;
int count;
int capacity;
public:
vector(void){
v = new T[capacity];
count = 0;
capacity=0;
capacity++;
}
void push_back(const T& t)
{
if(count+1>capacity)
{
capacity *= 2;
T* newData = new T[capacity];
for(int i=0; i <count; i++)
{
newData[i] = v[i];
}
delete[] v;
v = newData;
}
v[count++] = t;
}
主文件:
void TestPush(void)
{
std::cout << "\n********** TestPush **********\n";
cs150::vector<float> a;
std::cout << "Empty array:\n";
Print(a);
std::cout << "push_back 5 floats:\n";
for (float i = 0; i < 5; i++) {
a.push_back(i);
Print(a);
}
std::cout << "pop_back until empty:\n";
while (!a.empty()) {
a.pop_back();
Print(a);
}
}
嗯,看起来很清楚,这是你的代码
vector(void){
v = new T[capacity];
count = 0;
capacity=0;
capacity++;
}
不要增加容量,而是这样做
vector() {
count = 0;
capacity = 0;
v = new T[capacity];
}
请注意,您必须先设置 capacity
变量,然后再执行 new T[capacity];
void
是不必要的 顺便说一句
现在,由于您的容量比以前少了一个,因此您需要进行一些其他更改
void push_back(const T& t)
{
if(count+1>capacity)
{
capacity *= 2;
变成
void push_back(const T& t)
{
if (count+1>capacity)
{
capacity = std::max(2*capacity, 1);
这样如果之前容量为零,之后容量为1
问题是您在
行中使用了capacity
v = new T[capacity];
在 capacity
初始化之前。这是未定义行为的原因。
您应该先将 capacity
初始化为大于 0 的值。
vector(void) : count(0), capacity(1)
{
v = new T[capacity];
}