C++ STL库/C头文件函数

本文详细介绍了C++ STL库中的Vector、List、Set/Multiset、Map/Multimap以及String和优先队列的操作函数,包括它们的结构、性能、内存分配、构造、赋值、元素存取、迭代器相关函数等。此外,还提到了C头文件<string.h>中的常用函数,如strcpy、strcat等。通过深入理解这些函数,可以帮助开发者更好地利用C++ STL库进行高效编程。
摘要由CSDN通过智能技术生成

转载@Memset  转载@Jason333

目录

Vector                          操作函数

List                               操作函数

Set和Multiset               操作函数

Map和Multimap           操作函数

<String>

优先队列

<string.h >

<algorithm>


Vector

1、结构

  vector模塑出一个动态数组,因此,它本身是“将元素置于动态数组中加以管理”的一个抽象概念。vector将其元素复制到内部的dynamic array中。元素之间总存在某种顺序,所以vector是一种有序群集。vector支持随机存取,因此只要知道位置,可以在常数时间内存取任何一个元素。根据vector的结构可知,在末端添加或者删除元素,性能相当好,如果在前端或者中部安插或删除元素,性能就不怎么样了,因为操作点之后的元素都需要移到另一位置,而每一次移动都需要调用assignement(赋值)操作符。

2、大小(size)和容量(capacity)

2.1 性能 

  vector的优异性能的秘诀之一就是配置比其容纳元素所需更多的内存。vector用于操作大小的函数有size(),empty(),max_size(),另一个有关大小的函数是capacity(),它返回的是vector实际能够容纳的元素数量,如果超越这个数量,vector就有必要重新配置内部存储器。

  vector的容量之所以很重要,有以下两个原因:

  • 一旦内存重新分配,和vector相关的所有元素都会失效,如:references,pointers,iterators。
  • 内存分配很耗时间

2.2 内存分配

2.2.1 reserve

  如果程序管理了和vector元素相关的reference,pointers,iterator,或者执行效率至关重要,那么就必须考虑容器的容量问题。可以使用reserve()来保留适当容量,避免一再的分配内存,只要保留的容量有剩余,就不用担心reference失效。

std::vector<T> v;
v.reserve(n);   //为vector分配容量为n的内存

  还有一点要记住的是,如果调用reserve()所给的参数比当前的vector容量还小,不会发生任何反应,vector不能通过reverse来缩减容量。如何达到时间和空间的最佳效率,由系统版本决定,很多时候为了防止内存破碎,即使不调用reserve,当你第一次安插元素的时候,也会一次性配置整块内存(例如2K)。vector的容量不会缩减,即使删除元素,其reference,pointers,iterators也不会失效,继续指向发生动作之前的位置,然而安插元素可能使这些元素失效(因为安插可能重新分配内存空间)。

2.2.2 构造分配

  另外一种避免重新分配内存的方法是,初始化期间就像构造函数传递附加参数,构造出足够的空间。如果参数是个数值,它将成为vector的起始大小。

std::vector<T> v(500);  //分配能容纳500个T元素的内存大小

   当然,要获得这种能力,这种元素必须提供一个default构造函数,如果类型很复杂,提供了default构造函数,初始化也会很耗时,如果只是为了保留足够的内存,建议使用reverse()。

2.2.3 内存缩减

  当然,要想缩减vector内存还是有方法的,那就是两个vector交换了内容后,两者的容量也会交换,即保留元素,又缩减了内存。

复制代码

template<class T>
void shrinkCapacity(std::vector<T> &v)
{
    std::vector<T> temp(v);  //初始化一个新的vector
    v.swap(temp);             //交换元素内容
}

复制代码

  或者通过下列语句:

std::vector<T> (v).swap(v);

  不过应该注意的是,swap()之后,原先所有的reference,pointers,iterator都换了指涉对象,他们仍然指向原本位置,也就是说它们在交换之后,都失效了。

复制代码

void mvTestSize()
    {
        // size 为20的vector
        vector<int> veciSize1;
        for (int i = 0; i < 20; i++)
        {
            veciSize1.push_back(i);
        }

        cout << "v1 size:" << veciSize1.size() << endl;
        cout << "v1 max size:" << veciSize1.max_size() << endl;
        cout << "v1 capacity:" << veciSize1.capacity() << endl;

        // size为200的vector
        vector<int> veciSize2;
        for (int i = 0; i < 200; i++)
        {
            veciSize2.push_back(i);
        }

        cout << "v2 size:" << veciSize2.size() << endl;
        cout << "v2 max size:" << veciSize2.max_size() << endl;
        cout << "v2 capacity:" << veciSize2.capacity() << endl;

        //分配固定的size
        vector<int> veciSize3;
        veciSize3.reserve(1000);
        for (int i = 0; i < 20; i++)
        {
            veciSize3.push_back(i);
        }

        cout << "v3 size:" << veciSize3.size() << endl;
        cout << "v3 max size:" << veciSize3.max_size() << endl;
        cout << "v3 capacity:" << veciSize3.capacity() << endl;
    }

复制代码

  输出结果:

3、 vector操作函数

3.1 构造、拷贝和析构

  可以在构造时提供元素,也可以不提供。如果指定大小,系统会调用元素的default构造函数一一制造新元素。

操作

效果

vector<Elem> c

产生一个空的vector,没有任何元素

vector<Elem> c1(c2)

产生另一同一类型的副本 (所有元素都被拷贝)

vector<Elem> c(n)

利用元素的default构造函数生成一个大小为n的vector

vector<Elem> c(n,elem)

产生一个大小为n的vector,每个元素都是elem

vector<Elem> c(beg,end)

产生一个vector,以区间[beg,end)作为初始值

c.~vector<Elem>()

销毁所有元素,释放内存

3.2 非变动操作

操作

效果

c.size()

返回当前的元素数量

c.empty()

判断大小是否为零,等同于0 == size(),效率更高

c.max_size()

返回能容纳的元素最大数量

capacity()

返回重新分配空间前所能容纳的最大元素数量

reserve()

如果容量不足,扩大

c1 == c2

判断c1是否等于c2

c1 != c2

判断c1是否不等于c2(等同于!(c1==c2))

c1 < c2

判断c1是否小于c2

c1 > c2

判断c1是否大于c2

c1 <= c2

判断c1是否小于等于c2(等同于!(c2<c1))

c1 >= c2

判断c1是否大于等于c2 (等同于!(c1<c2))

 

3.3 赋值操作

操作

效果

c1 = c2

将c2的元素全部给c1

c.assign(n,elem)

复制n个elem给c

c.assign(beg,end)

将区间[beg,end)赋值给c

c1.swap(c2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值