54:深入学习c++(STL之容器,stdvector)

  1. 头文件

  2. #include <vector>

     

  3.  

  4. // vector 是 c++ 98中引入的动态数组 
    namespace std {
      template<typename T,typename Allocator = allocator<T>>
      class vector;
    }
    // 特点随机访问元素,末端添加删除元素,效率高,前嵯和中间删除和添加元素效率低,
    // 存在当前空器大小和容量的关系
    using Group = std::vector<float>;
    // 多种初始化
    Group a;
    Group b = a;
    Group c = {};// 空初化
    Group d(a);
    Group e(10);参数1为int时,则是申请多少个int的空间
    Group f(10,1.0f);// 申请10个元素,每个元素的值均为1.0f
    Group g(a.begin(),a.end());// 迭代器从头赋到尾
    Group h({1.0,2.0,3.0});// 初始化三个元素
    Group j = {1.0,2.0,3.0};// c++ 11 特有的用法


    d.empty() //是否为空 实现  return b.size() == 0;
    d.size();// 元素的数量
    d.max_size();// 一般用不着,只有大公司才考虑这个
    d.capacity();// 返回容器当前能够容纳的元素数量
    d.reserve( 100 );     // 新元素还没有构造, 上面的得用push_back,或插入初始
    d.resize(102);// d[101],d[102];// 申请了,可以马上用,
    d.clear(); // 将里面的元素清0,但只是清了,但大小可能是不变的,需要调用下面的来清理
    d.shrink_to_fit();// 真正的正确清空数据和释放内存

    // 赋值
    b = g;
    b.assign(3,1.0f);// 重新分配,并重置为 {1.0,1.0,1.0};
    b.assign(g.begin(),g.end());
    b.assign({1.0,1.0,1.0});


    // 交互
    swap()// 类似实现的类型,
    struct A {
      int * data;
      void swap(A &rhs){
      int * temp = rhs.data;
      rhs.data = data;
      data = temp;
      }
    }
    b.swap(a);// vector
    std::swap(a,b);


    // 元素的访问
    b[0];// 不存在的话,会异常
    b.at(0);
    b.front();// 不能直接用 需要判断  if !b.empty() { b.front(); }
    b.back();

    // 迭代器相关
    a.begin();
    a.end()
    a.cbegin();不可修改的
    a.cend()
    a.rbegin();倒转循环
    a.rend();
    a.crbegin()
    a.crend();

    a.pop_back();// 同样要判断是否为空,否则可能是错误
    if !a.empty() then a.pop_back(); // 单线程没毛病,但多线程,可能会出错,后面的新增的贴子会有讲解

    b.erase(b.begin())// 删除

  5. auto iterAfter = b.earase(b.begin());// 返回新的位置,一般for循环,比如

	struct _vec
	{
		bool b;
		int c;
		_vec()
		{
			b = false;
			c = 0;
		}
	};
	std::vector<_vec> vec;
	for (auto it = vec.begin();it != vec.end();)
	{
		if (it->b)
		{
			it  = vec.erase(it);// 条件删除,需要取回他的it最新的位置,全删除完,则返回 vec.end()
		}
		else
		{
			++it;
		}
	}
  1. b.erase(b.begin(),b.end()) // 效果相当 b.clear() 区间删除.后面的元素会依次向上移动

    // 插入
    b.push_back(10.0f);
    auto iter = b.insert(b.end(),100.0f) // 会返回当前插入数据的位置
    iter = b.insert(b.end(),10,100.0f);// 在最后插入10个这样子的元素
    b.insert(b.end(),f.begin(),f.end());
    b.emplace(b.end(),10.0f); // emplace_back只调用构造函数,没有移动构造函数,也没有拷贝构造函数。 以后可以使用 emplace_back 代替 push_back
    b.emplace_back(10.0f)

    // 清空 重置
    b.resize(10);
    b.resize(10,1.0f);// 重置为10个元素,值为1.0;
    b.clear()
    b.shink_to_fit();

    // 和C的接口调互
    sd::vector<char> carr(100,0);
    strcpy(&carr[0],"hello world\n");
    printf("%s",&carr[0]);
    // 错误用法
    printf("%s",carr.begin());

  2. // 总结:

  3. vecter 除开array 以外,是占用空间是最少的!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值