向量编程:不清楚向量的初始化

时间:2018-07-09 23:58:21

标签: c++ stl stdvector

我对vector的使用有疑问

考虑执行以下操作的代码:

int main(int argc, const char * argv[]) {

    printf("%s\n","CreateNewVector");
    vector<int> *vector1 = createNewVector(5);
    if(vector1){
        delete vector1;
        vector1=NULL;
    }

    printf("%s\n","AddToVector");
    vector<int> vector2;
    if(AddToVector(vector2))
    {

    }
        if(vector1)
        {
            delete vector1;
            vector1 = NULL;
        }
        return 0;
    }

奇怪的是,当调用createNewVector(5)时,它会打印以下内容!

CreateNewVector
Pushing createNewVector 5
Pushing createNewVector 4
Pushing createNewVector 3
Pushing createNewVector 2
Pushing createNewVector 1

0 0 0 0 0 5 4 3 2 1

这是CreateNewVector的代码

vector<int> * createNewVector(int n) {
    // YOUR CODE HERE
    vector<int> *vector1 = new vector<int>(n);
    for (int i=n;i>0;--i)
    {
        printf("Pushing %s %d\n",__FUNCTION__,i);
        vector1->push_back(i);
    }
    printf("\n");


    for(auto it = vector1->begin(); it!=vector1->end();it++)
        printf("%d ",*it);
    printf("\n");
    return vector1;
}

相比之下,我还有另一个代码(使用AddToVector),该代码仅通过引用获取一个矢量,并仅使用相同的API将其添加到其中

vector1->push_back(i);

Code for AddToVector
bool AddToVector(vector<int> &vector) {
    // YOUR CODE HERE
    int n = 5;
    for (int i=n;i>0;--i)
    {
        printf("Pushing %s %d\n",__FUNCTION__,i);
        vector.push_back(i);
    }
    printf("\n");


    for(auto it = vector.begin(); it!=vector.end();it++)
        printf("%d ",*it);

    printf("\n");
    return true;
}

我对具有一些冗余0的序列一无所知

现在,当我替换以向量为参考的代码并且进行相同的操作时,输出将很清晰,并且可以预期。 输出如下: AddToVector

Pushing AddToVector 5
Pushing AddToVector 4
Pushing AddToVector 3
Pushing AddToVector 2
Pushing AddToVector 1

5 4 3 2 1 

1 个答案:

答案 0 :(得分:1)

createNewVector

vector<int> *vector1 = new vector<int>(n);

使用vector的默认初始化值创建了n。这些是int,所以是0。这意味着使用n=5vector从包含5个0的构造函数中出来,然后程序推回5,4,3,2,1,得到给定的输出。

解决方案摆脱了构造函数中的n

vector<int> *vector1 = new vector<int>();

如果您想通过预先分配存储来节省时间(请注意:这样做将节省非常少的时间,如果有的话)

vector<int> *vector1 = new vector<int>();
vector1->reserve(5);

我对某些保留使用“您想要”。您不想动态分配vector。需要动态vector的原因很少,而不需要动态的原因却很多。最重要的不是因为您已在旨在消除手动内存管理的类上添加了手动内存管理要求。