VS 2019 亲测 ,绝对详细。
std::vector<char> v6;
auto v6_capacity = v6.capacity();
std::cout << "[V6]:" << std::endl;
std::cout << "Size:" << v6.size() << " MaxSize" << v6.max_size() << std::endl;
std::cout << "Capacity:" << v6.capacity() << std::endl;
for (int i = 0; i < 1000; i++)
{
v6.push_back('1'); //capacity 1, size 1, add allocator 1
if (v6.capacity() - v6_capacity)
{
std::cout << "Size:" << v6.size() << std::endl;
std::cout << "Capacity:" << v6.capacity() << std::endl;
std::cout << "add allocated apacity:" << v6.capacity() - v6_capacity << std::endl << std::endl;
}
v6_capacity = v6.capacity();
}
[V6]:
Size:0 MaxSize2147483647
Capacity:0
Size:1
Capacity:1
add allocated apacity:1
Size:2
Capacity:2
add allocated apacity:1
Size:3
Capacity:3
add allocated apacity:1
Size:4
Capacity:4
add allocated apacity:1
Size:5
Capacity:6
add allocated apacity:2
Size:7
Capacity:9
add allocated apacity:3
Size:10
Capacity:13
add allocated apacity:4
Size:14
Capacity:19
add allocated apacity:6
Size:20
Capacity:28
add allocated apacity:9
Size:29
Capacity:42
add allocated apacity:14
Size:43
Capacity:63
add allocated apacity:21
Size:64
Capacity:94
add allocated apacity:31
Size:95
Capacity:141
add allocated apacity:47
Size:142
Capacity:211
add allocated apacity:70
Size:212
Capacity:316
add allocated apacity:105
Size:317
Capacity:474
add allocated apacity:158
Size:475
Capacity:711
add allocated apacity:237
Size:712
Capacity:1066
add allocated apacity:355
刚刚做了一个实验,有人说是增长50%。但是!!!重点来了。具体多少可以自己算,毕竟标准库没有规定,VS2019的capacity增长结果来看:
+1(0.5进位 多计算0.5)A
+1(0.5舍去不进位 补回0.5)B
+1(0.5进位 多计算0.5)A
+1(0.5舍去不进位 补回0.5)B
+2(1整除) 0
+3(1.5进位 多计算0.5) A
+4(整除)
+6(整除)
+9(不进位 补回0.5) B
+14(整除)
+21(进位 多计算0.5) A
+31(不进位 补回0.5) B
+47(进位 多计算0.5) A
+70(整除)
+105(不进位 补回0.5) B
+158(整除)
+237(进位 多计算0.5) A
+355(不进位 补回0.5) B
. 如果前一次4舍5入进位后,下次就4舍5不入,不进位。
为什么要在意这个增长速度呢?
当Vector里面放的东西足够多,足够大时。就会影响效率。
因为Vector 每次增长,会创建一个新的 Vector也就是增长大小以后的Vector,然后会把所有东西都copy过去。然后清除原来的。这样就会造成很多很多次copy,如果是对象会进入多次拷贝构造。
当然如果自定义类型是支持移动构造函数的化,vector的copy会优先使用移动构造来交换。