vector :: reserve有什么问题?

时间:2019-08-08 19:22:57

标签: c++ stl iterator

我只是想学习用于竞争性编程的STL,并且对此表示怀疑! 1.当我使用vector :: reserve(n)时,标记为loop1和loop2的循环不会输出任何内容。 2.但是当我使用vector :: assign(n,0)时,标记为循环1和循环2的循环可以正常工作。 为什么会这样?

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
    int test;
    scanf("%d", &test);
    while (test > 0) {
        int n;
        scanf("%d", &n);
        vector<int> arr;

        arr.reserve(n);
        //arr.assign(n,0);

        for (int i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
        }

        sort(arr.begin(), arr.end());

        vector<int>::iterator itr;

        // loop1
        for (int x : arr) {
            printf("%d ", x);
        }

        //loop2
        for (itr = arr.begin(); itr != arr.end(); itr++) {
            printf("%d ", *itr);
        }

        test--;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

这是一个常见错误。 std::vector::reserve不会创建元素或更改容器的大小;您实际上是在导致未定义的行为。 reserve仅更改容量。您正在寻找std::vector::resize来更改大小。这是一个清晰的示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> ivec;
    std::cout << ivec.size() << " - " << ivec.capacity() << '\n'; // 0 - 0
    ivec.reserve(100);
    std::cout << ivec.size() << " - " << ivec.capacity() << '\n'; // 0 - 100
    ivec.resize(30);
    std::cout << ivec.size() << " - " << ivec.capacity() << '\n'; // 30 - 100
}

答案 1 :(得分:0)

vector::reserve不会更改矢量的大小。取而代之的是,它只是分配了额外的内存,从而增加了向量用于push_back等操作的容量。

例如:

std::vector<int> v;
// v.size() == 0, v.capacity() == 0
for(int i = 0; i < 100; i++) {
    v.push_back(i); // This will resize the vector a few times
}
// v.size() == 100, v.capacity() >= 100

std::vector<int> v;
v.reserve(100); 
// v.size() == 0, BUT v.capacity() >= 100

for(int i = 0; i < 100; i++) {
    v.push_back(i); // This won't resize the vector now
}

如果要更改矢量的大小,请使用vector::resize