容器包括关联容器和顺序容器。
关联容器是通过键(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所占内存