后推功能的容量问题

时间:2019-03-01 16:54:09

标签: c++ class 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);
}
}

2 个答案:

答案 0 :(得分:2)

问题是您在行中使用capacity

v = new T[capacity];

capacity初始化之前。这是导致行为不确定的原因。

您应该首先将capacity初始化为大于0的值。

vector(void) : count(0), capacity(1) 
{
    v = new T[capacity];
}

答案 1 :(得分:1)

看起来很清楚,这是您的代码

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是不必要的BTW

现在,由于您的容量比以前减少了一个,因此您需要进行其他一些更改

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);

因此,如果容量为零,那么容量将为一。