从新捡起c++,从stl开始(1)

容器包括关联容器顺序容器

关联容器是通过键(key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。

顺序容器包括:vector  list  deque等,vector是表示一串连续的内存地址,基于数组实现.   list是不连续的内存地址,基于链表实现,deque和vector类似,对于首元素提供插入和删除的双向支持。

关联容器:map和set,  map是key-value类型,(redis也是key-value类型,不懂可忽略)。set是单值,map和set的key值唯一。multimap和multiset可以存放多个相同的key值。

vector:

1.可变大小的数组序列容器。

2.vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

3.vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

4.vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

5.vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

6.与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。

#include <vector> //头文件

vector<int> vecInt; //int类型vector 仅声明

vector<int> vecInt(5);  //定义大小

vector<int> vecInt(5,1); //定义大小为5,初始值都为1


vecInt.size(); //vector的大小
vecInt.max_size(); //最大容量
vecInt.empty(); //是否为空

vecInt.push_back(); //末尾添加元素
vecInt.pop_back(); //弹出最后一个元素

vecInt.begin(); //开始指针
vecInt.end();   //尾部指针
vecInt.cbegin(); //同上,不能通过这个指针修改内容。
vecInt.cend();   //同上

vecInt[index]; //下标访问
vecInt.at(index); //下标访问,顺便检查是否越界,越界会抛出一个错误

#include <iostream>
#include <vector>
using namespace std;

void print_vector(vector<int>& val)
{
    cout << "============" << endl;
    vector<int>::iterator it; 
    for(it = val.begin(); it != val.end(); ++it)
    {   
        cout << *it << " ";
    }   
    cout << endl;
}

int main()
{
    vector<int>::iterator it; //迭代器
    vector<int> val;  //vector

    for(int i=0; i<10; i++)
    {
        val.push_back(i); //val添加函数
    }
    
    //打印下上面添加的vector
    /*
    for(it = val.begin(); it != val.end(); it++)
    {
        cout << *it << endl;
    }*/
    
    print_vector(val);
    val.erase(val.begin()+1); // 删除第一个元素 1 (从0开始计算的)
    print_vector(val);
    val.insert(val.begin()+1, 11); //插入11到原来1的位置上
    print_vector(val);    

    val.erase(val.begin()+2, val.begin()+5); //删除到val.begin()+5的位置之前。
    print_vector(val);    

    cout << val.size() << endl; //
    cout << val.max_size() << endl;
    
    val.clear(); //清空
    return 0;
}

result:
============
0 1 2 3 4 5 6 7 8 9 
============
0 2 3 4 5 6 7 8 9 
============
0 11 2 3 4 5 6 7 8 9
============
0 11 5 6 7 8 9  
size:7
max_size:4611686018427387903

//一些插入的误区
vector<int> v;
for(int i=0; i<=10;i++)
{
    v[i] = i; //error,可以这样读,但不可以这样写入
}

内存管理方面:

看到这个文章,这里讲的很详细,可以看看,这是链接:https://blog.csdn.net/hancunai0017/article/details/7032383

使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。

使用“交换技巧”来修整vector过剩空间/内存

用swap方法强行释放STL Vector所占内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值