C++ STL容器vector篇(四) vector容器交换, 预留空间

241 阅读1分钟

交换数组

作用: 在数组的内存分配过大时采用swap()函数可以回收被过多分配的空间, 减少内存占用

#include <iostream>
#include <vector>

using namespace std;


void test1()
{
    // 尾插法插入元素
    vector<int> v;
    for (int i = 0; i < 10000; i++)
    {
        v.push_back(i * 2 + 1);
    }

    // 在内存分配过大时采用swap()函数可以回收被过多分配的空间
    cout<<"size: "<<v.size()<<endl;
    cout<<"capacity: "<<v.capacity()<<endl;

    v.resize(3);
    cout<<"size: "<<v.size()<<endl;
    cout<<"capacity: "<<v.capacity()<<endl;

    // 此时使用swap()回收内存
    vector<int>(v).swap(v);

    cout<<"size: "<<v.size()<<endl;
    cout<<"capacity: "<<v.capacity()<<endl;
}

int main(int argc, char const *argv[])
{
    test1();
    return 0;
}

预留空间

#include <iostream>
#include <vector>

using namespace std;


void test1()
{
    // 尾插法插入元素
    vector<int> v;
    // 统计内存开辟次数
    int num = 0;
    int *p = NULL;
    for (int i = 0; i < 10000; i++)
    {
        v.push_back(i * 2 + 1);

        if (p != &v[0])
        {
            p = &v[0];
            num++;
        }
    }
    cout<<"内存重新分配的次数: "<<num<<endl;

    // 尾插法插入元素
    vector<int> v1;

    // 预留空间reserve(), 使内存不会多次分配
    v1.reserve(10000);

    // 统计内存开辟次数
    int num1 = 0;
    int *p1 = NULL;
    for (int i = 0; i < 10000; i++)
    {
        v1.push_back(i * 2 + 1);

        if (p != &v1[0])
        {
            p = &v1[0];
            num1++;
        }
    }
    cout<<"利用reserve()预留空间之后, 内存重新分配的次数: "<<num1<<endl;
}

/*
 * 内存重新分配的次数: 15
 * 利用reserve()预留空间之后, 内存重新分配的次数: 1
 */

int main(int argc, char const *argv[])
{
    test1();
    return 0;
}