C++ 向量大小和容量

示例

向量大小只是向量中元素的数量:

  1. 当前向量大小由size()成员函数查询。如果size为0,则便利empty()函数返回true:

    vector<int> v = { 1, 2, 3 }; // 大小是3
    const vector<int>::size_type size = v.size();
    cout << size << endl; // 版画3
    cout << boolalpha << v.empty() << endl; // 打印错误
  2. 默认构造的向量的大小为0:

    vector<int> v; // 大小为0
    cout << v.size() << endl; // 打印0
  3. 添加N元素向量增加大小由N(例如,由push_back(),insert()或resize()函数)。

  4. 除去N从向量元素减小尺寸由N(例如,由pop_back(),erase()或clear()函数)。

  5. Vector的大小有一个特定于实现的上限,但是在达到它之前,您可能会用完RAM:

    vector<int> v;
    const vector<int>::size_type max_size = v.max_size();
    cout << max_size << endl; // 打印大量
    v.resize( max_size ); // 可能行不通
    v.push_back( 1 ); // 绝对行不通

常见错误:尺寸不一定(甚至通常)int:

// !!!!!!!!!!!!!
vector<int> v_bad( N, 1 ); // 构造大的N尺寸向量
for( int i = 0; i < v_bad.size(); ++i ) { // 大小不应该是整数!
    do_something( v_bad[i] );
}

向量容量大小不同。而尺寸仅仅是矢量目前有多少个元素具有容量为它有多少个元素分配/保留的存储器。这很有用,因为过大的(太)频繁的(重新)分配可能会很昂贵。

  1. 当前向量容量由capacity()成员函数查询。容量始终大于或等于大小

    vector<int> v = { 1, 2, 3 }; // 大小是3, capacity is >= 3
    const vector<int>::size_type capacity = v.capacity();
    cout << capacity << endl; // prints number >= 3
  2. 您可以按reserve( N )功能手动保留容量(将向量容量更改为N):

    // !!!!!!!!!!!!!
    vector<int> v_bad;
    for( int i = 0; i < 10000; ++i ) {
       v_bad.push_back( i ); // 可能有很多重新分配
    }
    // 好
    vector<int> v_good;
    v_good.reserve( 10000 ); // 好! only one allocation
    for( int i = 0; i < 10000; ++i ) {
       v_good.push_back( i ); // 不再需要分配
    }
  3. 您可以请求释放多余的容量shrink_to_fit()(但是实现不必服从您)。这对于节省使用的内存很有用:

    vector<int> v = { 1, 2, 3, 4, 5 }; // 大小为5,假设容量为6
    v.shrink_to_fit(); // 容量为5(或可能仍为6)
    cout << boolalpha << v.capacity() == v.size() << endl; // 打印可能为真(但可能为假)

向量在某种程度上自动管理容量,当您添加元素时,它可能决定增长。实施者喜欢使用2或1.5作为增长因子(黄金比率将是理想值-但由于是有理数,因此不切实际)。另一方面,矢量通常不会自动缩小。例如:

vector<int> v; // 容量可能(但不能保证)为0
v.push_back( 1 ); // 容量是一些入门值,可能是1
v.clear(); // 大小为0 but capacity is still same as before!

v = { 1, 2, 3, 4 }; // 大小为4,并假设容量为4。
v.push_back( 5 ); // 容量增加-假设它增加到6(1.5因子)
v.push_back( 6 ); // 容量不变
v.push_back( 7 ); // 容量增长-假设它增长到9(1.5因子)
// 等等
v.pop_back(); v.pop_back(); v.pop_back(); v.pop_back(); // 容量保持不变