c++ STL

来源:互联网 发布:js请求servlet 编辑:程序博客网 时间:2024/06/08 17:17

mainly introduce vector's : instructions、implement、thread-safety
vector容器使用较多,记录积累它

instructions

  • 基本介绍
#include <vector>  //头文件using namespace std; //名空间

vector 存储空间连续;list不连续;

  • 初始化
std::vector<std::string> vec_str1; //空的vec,存储string类型vector<string> vec_str2(vec_str1); //使用另一个vec,来初始化新的vecvector<string> vec_str3(10); //创建具有10个空间的vec,但此时没有元素vector<int> vec_int(arr,arr+6);//使用数组,前6个值,初始化vec
  • 元素存储及访问
vec_str1.push_back(str1);//尾部存放一个string元素vec_str1.at(INDX); //访问位置INDX处的元素,越界抛异常out of rangevec_str[INDX];//无异常检查//最长用迭代器来访问for (vector<string>::iterator it = vec_str1.begin();it != vec_str1.end(); ++it){     cout << "it->内容:" << *it <<endl;}
  • 其它函数介绍
函数描述c.empty()判断容器是否为空c.size()容器实际装的元素个数;c.capcity()容器能装元素的个数;c.reserve()保留适当的容器大小c.insert(pos,element)在pos位置插入一个elem元素拷贝;返回新数据位置;void erase(iterator pos) void erase(iterator first,iterator last)删除pos位置/值为val/起始位置元素;返回下一个数据位置;c.clear()清空容器中的所有元素;c1.swap(c2) swap(c1,c2)将容器c1和c2中的元素互换;
//有意思的应用:当大量删除了vec中元素时,此容器的capcity比较大,但size很小了。造成空间浪费;//如何消除臃肿,释放空间?创建自身拷贝,再和其互换;vector<string> v1;//capcity是100 ,size是2 vector<string> (v1).swap(v1); //v1调整为capcity为2;相当于下面过程:vector<string> v2(v1);// v2 capcity 和 size 都为2v2.swap(v1); //v1的capcity是2 ,V2的capcity是1000;

implement

template<class _Ty,    class _Ax>    class vector        : public _Vector_val<_Ty, _Ax>    {   // varying size array of valuespublic:    /********/protected:    pointer _Myfirst;   // pointer to beginning of array    pointer _Mylast;    // pointer to current end of sequence    pointer _Myend; // pointer to end of array    };

分别对应于resize()、reserve()两个函数。
size表示vector中已有元素的个数,容量表示vector最多可存储的元素的个数;为了降低二次分配时的成本,vector实际配置的大小可能比客户需求的更大一些,以备将来扩充,这就是容量的概念。即capacity>=size,当等于时,容器此时已满,若再要加入新的元素时,就要重新进行内存分配,整个vector的数据都要移动到新内存。二次分配成本较高,在实际操作时,应尽量预留一定空间,避免二次分配

thread-safety

  • 结论STL 线程不安全,每次插入,删除,读取元素,保证原子性

来自<< Effective STL >> 条款十二

1、在每次调用容器的成员函数期间都要锁定该容器。
2、在每个容器返回的迭代器(例如通过调用begin或end)的生存期之内都要锁定该容器。
3、在每个在容器上调用的算法执行期间锁定该容器。(这事实上没有意义,因为,正如条款32所解释的,算法没有办法识别出它们正在操作着的容器。不过,我们将在这里检验这个选项,因为它的意义在于看看为什么即使是可能的它也不能工作。)

  • 实现线程安全? 参考:http://blog.csdn.net/xsckernel/article/details/52093902
0 0