c++ STL - vector

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,来初始化新的vec
vector<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 range
vec_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 都为2
v2.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 values
public:
    /********/
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所解释的,算法没有办法识别出它们正在操作着的容器。不过,我们将在这里检验这个选项,因为它的意义在于看看为什么即使是可能的它也不能工作。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值