【问题标题】:vector programming : Not clear about the initialization of the vector向量编程:不清楚向量的初始化
【发布时间】:2018-12-17 17:24:33
【问题描述】:

我在使用矢量时遇到问题

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

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 的序列一无所知

现在,当我替换以向量作为参考的代码并且有点做同样的事情时,输出很清楚并且是预期的。 输出如下: 添加到向量

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

5 4 3 2 1 

【问题讨论】:

  • 几乎没有理由像这样动态创建矢量。
  • 为什么在 C++ 程序中使用 C I/O?向量将为您管理动态内存分配,因此您不必自己使用new 进行分配。您需要做的就是vector&lt;int&gt; foo;AddToVector 在总是返回 true 时返回 bool 有什么意义?

标签: c++ stl stdvector


【解决方案1】:

createNewVector

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

使用n 默认初始化值创建了一个vector。这些是ints,所以是 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 的原因很少,而您不想要的原因有很多。最重要的可能不是因为您已将手动内存管理要求添加到旨在消除手动内存管理的类中。

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 2011-03-04
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多