int arr[10][10]; memset(arr,0,10*10*sizeof(int)); //初始化 int tmp[10][10]; memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷贝
void *memcpy(void *destin, void *source, unsigned n); //源*目的内存覆盖问题c++
memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;数组
array<T,N> (数组容器) :基于数组,长度固定的序列,有 N 个 T 类型的对象。数据结构
vector<T> (向量容器) :基于数组,长度可变的序列,用来存放T类型的对象,预留分配大一些的一段连续空间,当超出时会二次分配更大的拷贝过去。函数
deque<T> (双端队列容器) :长度可变序列,用来存放T类型的对象,在序列的两端都能高效地增长或删除元素,由一段一段的定量连续空间构成,下标访问必须进行二次指针解引用,与之相比 vector 的下标访问只进行一次,只保有一个元素的 deque 必须分配其整个内部数组(例如 64 位 libstdc++ 上为对象大小 8 倍; 64 位 libc++ 上为对象大小 16 倍或 4096 字节的较大者)。优化
list<T> (链表容器) :长度可变的、由 T 类型对象组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方均可以高效地增长或删除元素。访问容器中任意元素的速度要比前三种容器慢,这是由于 list<T> 必须从第一个元素或最后一个元素开始访问,须要沿着链表移动,直到到达想要的元素。ui
forward list<T> (正向链表容器) :长度可变的、由 T 类型对象组成的序列,它以单链表的形式组织元素,是一类比链表容器快、更节省内存的容器,可是它内部的元素只能从第一个元素开始访问。spa
string:与vector类似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。.net
全部序列容器的函数成员 max_size() 都会返回它能存储的元素个数的最大值。这一般是一个很大的值,通常是 2^32 -1。指针
The standard container classes vector, deque and list fulfill these requirements. By default, if no container class is specified for a particular stack class instantiation, the standard container deque is used. code
默认使用deque
而不是vector
做为底层容器
map<string,vector<int> > empty_map1; map1.swap(empty_map1); map1.clear(); 或 StrategyMap().swap(_stg_flows);
map.clear()只是把map清空了,可是内存没有释放,若是要释放内存不止是要clear()掉,还要和一个空的map来进行swap,将内存释放。
注意map中若是元素不是基本类型,也要进行内存释放,如指针,vector要尤为注意,不然map占的内存太大,会形成程序崩溃。
size表示vector中已有元素的个数,capacity表示vector最多可存储的元素的个数;
为了下降二次分配时的成本,vector实际配置的大小可能比客户需求的更大一些,以备未来扩充,这就是容量的概念。即capacity>=size,
reserve(Count) 函数主要是预留Count大小的空间,对应的是容器的容量.
resize(Count) 函数主要是用于改变size的,也就是改变vector的大小,最终改变的是(_Mylast - _Myfirst)的值,当size < Count时,就插入元素,当size >Count时,就擦除元素。
array: 固定长度的数组,使用栈(静态内存分配),所以效率与数组相同。
使用fill方法实现了数据填充。
使用size方法取得数组的大小。
虽然at(i)方法实现带有越界检查的读写。
写入速度的比较结果:内置数组的速度最快,vector容器次之,array容器最慢???
拷贝速度:http://www.javashuo.com/article/p-rcpabios-gr.html
拷贝:/* 未开优化: array=466ms vector=7923ms memcpy=198ms */ /* -O3优化,最高速度: array=0ms vector=453ms memcpy=0ms */
在STL中,使用迭代器(内置类型 iterator)给出数据在表中的位置
containerType::iterator itr
;containerType::const_iterator itr
;containerType::reverse_iterator itr
;containerType::const_reverse_iterator itr
;经常使用的须要使用迭代器的容器方法:
iterator insert(iterator pos, const Object & x)
:添加x到表中迭代器pos所指向的位置以前的位置。对1ist是常量时间操做,对vector则不是。返回值是一个指向插入项位置的迭代器iterator erase(iterator pos)
:删除迭代器所给出位置的对象。对1ist是常量时间操做,对vector不是。返回值是调用以前pos所指向元素的下一个元素的位置。这个操做使pos失效。pos再也不有用,由于它所指向的容器变量已经被删除了iterator erase(iterator start, iterator end)
:删除全部的从位置start开始直到位置end(可是不包括end)的全部元素