• 【STL基础】vector


     vector

    构造函数:

    //default:
    vector<T> v;            //空的vector
    
    //fill:
    vector<T> v(n);                //n个元素的vector,元素默认初始化
    vector<T> v(n, value);        //n个元素值为value的vector
    
    //range:
    vector<T> v(first, last);     //两个迭代器之间的元素构成的vector
    vector<T> v(arr, arr + sizeof(arr) / sizeof(T));    //由内置数组构造的vector
    
    //copy:
    vector<T> v(const vector<T> &u);        //v是u的拷贝
    
    //move:
    vector<T> v(vector<T> &&x);    //x是右值引用(只能引用右值,如vector<int> &&x = {1,2,3};)
    
    //initializer list:
    vector<T> v{value1, value2...};

    赋值与swap:

    v1 = v2;
    v1 = {value1, value2...};
    v1.swap(v2); swap(v1, v2);

    大小:

    size_type v.size() const noexcept;    //元素数目
    size_type v.capacity() const noexcept;    //当前为该vector分配的空间可以容纳的元素数目
    size_type v.max_size() const noexcept;    //可容纳元素的最大数目 
    //max_size >= capacity >= size
    bool v.empty()    //是否为空
    v.resize(n);    //调整元素大小,使容器中含n个元素
    v.resize(n, value);    //调整后的vector中每个元素的值都为value
    v.reserve(n);    //请求改变capacity的大小,使得vector至少可以容纳n个元素
    v.shrink_to_fit();    //请求退还多余内存,但标准库不保证完全退还(C++11)

    获取元素:

    v[i] = value;
    v.at(i) = value;
    v.front() = value;    //第一个元素
    v.back() = value;    //最后一个元素
    T *p = v.data();      //p为指向v中第一个元素的指针(C++11)

    修改:

    //assign
    v.assign(n, value);    //将v置为n个值为value的元素
    v.assign(first, last);    //用t的两个迭代器之间的值为v赋值,左闭右开 t可以是vector、array、list、forward_list、deque、set、unordered_set、multiset、unordered_multiset等。 vector元素的顺序和重复性由传入的容器类型性质决定
    v.assign(begin(t), end(t));       //与上条语句类似,除上述类型,还支持内置数组类型
    v.assign(arr, arr + n);    //将数组中的一部分赋给v
    v.assign({value1, value2...});    //列表
    
    v.push_back(value);    //尾部插入一个元素
    v.pop_back();         //删除最后一个元素
    
    //insert
    v.insert(it, value);    //迭代器指向的位置插入值为value的元素
    v.insert(it, n, value);    //迭代器指向的位置插入n个值为value的元素
    v.insert(it, first, last);    //迭代器it指向的位置插入另一个容器的两个迭代器之间的元素         
    v.insert(it, x);        //x是T的右值引用 T&&
    v.insert(it, {value1, value2...});    //列表
    //以上函数返回一个指向新插入的第一个元素的迭代器
    
    //emplace(C++11)
    v.emplace(it,  args);    //以args为参数,调用T的构造函数构造一个对象插入it所指的位置
    v.emplace_back(args);    //将构造的T对象插入vector的尾部
    //以上函数返回一个指向新插入的元素的迭代器
    
    //insert vs emplace:
    //insert传对象或引用,emplace传参数调用构造函数
    struct Foo
    {
      Foo(int n, double x);
    };
    std::vector<Foo> v;
    v.emplace(someIterator, 42, 3.1416);
    v.insert(someIterator, Foo(42, 3.1416));
    
    //erase
    v.erase(it);    //删除it指向的元素
    v.erase(first, last);    //删除范围内的元素
    //以上函数返回一个迭代器,指向被删除的最后一个元素之后的元素
    
    v.clear();    //删除所有元素

    获取迭代器:

    v.begin(), v.end();    //首元素位置,尾后位置
    v.cbegin(), v.cend();    //const_iterator
    
    //reverse_iterator    按逆序寻址
    //const_reverse_iterator
    v.rbegin(), v.rend();
    v.crbegin(), v.crend();

    begin(v), end(v);

     以上带c的版本是C++11引入的, 用以支持auto。

    vector<bool>特有的函数:

    void flip() noexcept;    //所有元素取反
    static void swap (ref1, ref2) noexcept;    //除通用的swap,还有一个静态swsap函数,用于交换ref1和ref2对应的位.
  • 相关阅读:
    DataGrid 的鼠标点击
    Menu菜单
    密码问题
    Combobox代码
    EndpointContracts
    the Differences between abstract class & interface in C#接口和抽象类的区别
    How to get MetaData on client side in WCF?如何在客户端获取WCF service的元数据
    Endpoint
    Assembly Essence 程序集深入探讨:程序集结构及部署
    EndpointBinding
  • 原文地址:https://www.cnblogs.com/dengeven/p/3737546.html
Copyright © 2020-2023  润新知