首页 > 解决方案 > vector::reserve 有什么问题?

问题描述

我只是想为竞争性编程学习 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;
}

标签: c++stliterator

解决方案


这是一个常见的错误。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
}

推荐阅读