我只是想学习用于竞争性编程的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;
}
答案 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
。