zoukankan      html  css  js  c++  java
  • c++98 stl-vector

    #include <vector>
    #include <iostream>
    #include <cstring>
    //#include <memory>
    //c++ 98
    
    static void vectorPart() {
    //vector 是c++98中引入的动态数组(dynamic array)
    //namespace std {
    //template<typename T, typename Allocator = allocator<T>> //就是用默认的alloctor了,
    //	class vector;
    //}
    //特点随机访问元素, 末端添加删除元素效率最高, 前端和中间删除和添加元素效率最低,
    //存在当前容器大小和容量的关系
    using Group = std::vector<float>;
    
    Group a;
    Group b = a; //拷贝构造
    Group c(a); //拷贝构造
    Group d(10); //定义容量的大小
    Group e(10, 1.0f); //10个初始化为1.0
    Group f(e.begin(), e.end()); //传入两个迭代器,中间的所有值都会被拷贝
    Group g({1.0f, 2.0f, 3.0f}); //c++11, 把写好的元素直接填
    Group h = {1.1f, 2.1f, 3.1f};
    Group i {1.2f, 2.2f, 3.2f, 4.2f}; //initialize list
    
    d.empty();
    d.size(); //当前的大小
    d.max_size(); //max_size()相对于其他容器的要小一些
    d.capacity(); //最多能在装入多少个元素,前提没有分配内存的情况下.
    d.reserve(100); //预先分配100个内存空间
    d.shrink_to_fit(); //c++11 
    
    //operator == != < > <= >=
    
    //赋值
    b = g;
    b.assign(3, 1.0f); //代表重新分配元素为: {1.0f, 1.0f, 1.0f}
    b.assign(g.begin(), g.end());
    b.assign({1.0f, 2.0f, 3.0f});
    
    //交换: 交换给vector类中的指针,效率比较高
    b.swap(a);
    std::swap(a, b); 
    
    //元素访问:
    b[0];
    b.at(0); //越界抛出异常: std::out_of_range
    if(b.empty()) {
    	b.front(); //一定要检查, 不然会出现错误, undefined
    	b.back();
    
    }
    b.front();
    b.back();
    
    //迭代器相关:
    a.begin();
    a.end();
    a.cbegin();
    a.cend();
    a.rbegin();
    a.rend();
    a.crbegin();
    a.crend();
    
    //
    //去除最后一个元素
    //signal thread OK, multthread maybe wrong
    a.pop_back(); //maybe wrong
    
    //删除某个特定位置的元素
    b.erase(b.begin()); //删除掉迭代器当前位置的元素, 而后面的元素会往前移动, 返回下一个元素的位置
    b.erase(b.begin(), b.end()); //删除掉迭代器中间元素
    //要检查迭代器是否失效
    
    b.push_back(10.0f); //尾部插入元素
    b.pop_back(); //获取尾部元素,且释放
    
    //在某个位置插入元素
    //在尾部插入100.0
    auto iter = b.insert(b.end(), 100.0f); //返回插入元素所在的迭代器
    iter = b.insert(b.end(), 10, -10.0f); //在尾部插入10个 -10.0f
    b.insert(b.end(), h.begin(), h.end()); //在尾部插入 两个迭代器之间的元素
    
    b.emplace(b.end(), 10.0f); //c++11
    b.emplace_back(10.0f); //c++11  && move copy 右值 拷贝
    
    b.resize(10); //设置vector的大小
    // 若改变小了,就会调用元素相应的析构
    b.resize(100, 1.0f); //把vector的大小设置为100,若元素个数不足100,以值为:1.0来填充到100
    b.clear(); //注意: 并不会让以前所占的内存降低, 只是可以把空间腾出来
    b.shrink_to_fit(); //c++11, 降低内存到合适的大小
    
    //和C的接口互用
    std::vector<char> carr(100, 0);
    strcpy(&carr[0], "hello World
    "); //最好用 carr.data();
    printf("%s", carr.data());
    //错误用法:
    printf("%s", carr.begin());
    
    //异常:
    //1. push_back
    //2. 元素 move / copy 没有异常的话
    //insert
    //emplact
    //emplce_back
    //push_bakc
    //pop_back
    //erase
    //swap
    //clear 都不会有异常
    
    //特殊:
    //标准化的失误:  不要使用,std::vector<bool>
    }
    int main(int, char**) {
    
    	return 0;
    }
    
  • 相关阅读:
    SQLSever语句(增、删、改、查)一、增:有4种方法1.使用insert插入单行数据
    Java-IDEA环境搭建swagger
    Kettle Rest大文件上传(RestUploadFile.ktr) Rest文件下载(FileDownload.ktr)
    Mybatis find_in_set 子查询,替代 in
    Kettle-Spoon入门示例
    TruncateTable数据库清理
    域账户密码登录验证
    数据库表新增触发器
    第一个Delphi小程序
    Java 方法重载
  • 原文地址:https://www.cnblogs.com/lyxf/p/12358419.html
Copyright © 2011-2022 走看看