zoukankan      html  css  js  c++  java
  • 向量

    1)基本特性
    A.连续内存,下标访问。
    B.动态内存管理,静态预分配。
    2)实例化
    #include <vector>
    using namespace std;
    A.空向量
    vector<元素类型> 向量对象;
    vector<int> vi;
    大小为0,元素数为0,向量对象的字节大小是一个常量——12字节。

    B.初始大小
    vector<元素类型> 向量对象 (元素数);
    vector<int> vi (5); // 0 0 0 0 0
    基本类型元素,用"0"初始化,类类型元素,用缺省构造函数初始化。

    C.初始值
    vector<元素类型> 向量对象 (元素数, 初值);
    vector<int> vi (5, 10); // 10 10 10 10 10

    D.范围初始化
    vector<元素类型> 向量对象 (起始迭代器, 终止迭代器);
    int ai[5] = {1, 2, 3, 4, 5};
    vector<int> vi (ai, ai + 5); // 1 2 3 4 5
    vector<int> vi (&ai[0], &ai[5]);

    #include <iostream>
    #include <vector>
    using namespace std;
    void print (vector<int> const& vi) {
        cout << "字节数:" << sizeof (vi)
            << endl;
        size_t size = vi.size ();
        cout << "元素数:" << size << endl;
        cout << "元  素:" << flush;
        for (size_t i = 0; i < size; ++i)
            cout << vi[i] << ' ';
        cout << endl;
    }
    int main (void) {
        vector<int> v1;
        print (v1);
        vector<int> v2 (5);
        print (v2);
        vector<int> v3 (5, 10);
        print (v3);
        int ai[5] = {10, 20, 30, 40, 50};
        vector<int> v4 (ai, ai + 5);
        print (v4);
    //    vector<int> v5 (ai + 1, ai + 4);
        vector<int> v5 (&ai[1], &ai[4]);
        print (v5);
        return 0;
    }

    注意在STL中用两个迭代器表示一个范围时,其终止迭代器永远是该范围中最后一个元素下一个位置的迭代器。
    1 2 3 [4 5 6 7] 8 9 10
    ^ ^
    | |
    起始迭代器 终止迭代器

    3)迭代器

    A.四个迭代器类型
    正向可写迭代器:iterator
    正向只读迭代器:const_iterator
    反向可写迭代器:reverse_iterator
    反向只读迭代器:const_reverse_iterator
    B.八个特征迭代器
    begin (void); // 正向可写起始迭代器
    end (void); // 正向可写终止迭代器
    begin (void) const;
    end (void) const;
    rbegin (void);
    rend (void);
    rbegin (void) const;
    rend (void) const;
    --------------------
    begin - 起始
    end - 终止
    不带const - 可写
    带const - 只读
    不带r - 正向
    带r - 反向
    对于正向迭代器而言,起始位置在首元素,终止位置在尾元素之后;对于反向迭代器而言,起始位置在尾元素,终止位置在首元素之前。

    C.随机迭代器
    所有顺序迭代器的功能随机迭代器都支持,同时还提供更多功能:和整数加减运算、同型迭代器之间的大小比较和相减运算

    *****************D.任何可能导致容器内存布局发生变化的结构性改变,如增删元素等,都可能使原先获得的迭代器失效,因此稳妥起见,在这样的改变发生以后应该重新获得反应新内存布局的迭代器,保证元素访问正确。

    #include <iostream>
    #include <vector>
    using namespace std;
    void print (vector<int> const& vi) {
        for (vector<int>::const_iterator it =
            vi.begin (); it != vi.end ();
            ++it)
            cout << /*++*/*it << ' ';
        cout << endl;
    }
    void rprint (vector<int> const& vi) {
        for (vector<int>::const_reverse_iterator it =vi.rbegin (); it != vi.rend ();++it)
            cout << *it << ' ';
        cout << endl;
    }
    int main (void) {
        vector<int> vi;
        for (int i = 1; i <= 10; ++i)
            vi.push_back (i);
        size_t size = vi.size ();
        for (size_t i = 0; i < size; ++i)
            cout << vi[i] << ' ';
        cout << endl;
        for (vector<int>::iterator it =
            vi.begin (); it != vi.end ();
            ++it)
            cout << *it << ' ';
        cout << endl;
        print (vi);
        for (vector<int>::reverse_iterator it
            = vi.rbegin (); it != vi.rend ();
            ++it)
            cout << *it << ' ';
        cout << endl;
        rprint (vi);
        // vi: 1 2 3 4 5 6 7 8 9 10
        /*
        vi[4] = 50;
        print (vi);
        */
        vector<int>::iterator it1 =
            vi.begin ();
        /*
        *++++++++it1 = 50;
        */
        *(it1 + 4) = 50;
        print (vi);
        vector<int>::iterator it2 =
            vi.end () - 1;
        // 越靠近起始位置的迭代器越小,越靠近终止位置的迭代器越大
        cout << boolalpha << (it1 < it2)
            << endl; // true
        // it1 + 9 == it2
        cout << it2 - it1 << endl; // 9
        vector<int>::reverse_iterator it3 =
            vi.rbegin (), it4 =
            vi.rend () - 1;
        cout << (it4 < it3) << endl; // false
        cout << it3 - it4 << endl; // -9
        vector<int> vn;
        vn.push_back (100);
        it1 = vn.begin ();
        cout << *it1 << endl; // 100
        vn.push_back (200);
        it1 = vn.begin ();
        cout << *it1 << endl; // 100
        vn.clear ();
        vn.push_back (11);
        vn.push_back (22);
        vn.push_back (44);
        vn.push_back (33);
        vn.push_back (55);
        print (vn);
        it1 = vn.begin ();
        while (it1 != vn.end ())
            if (*it1 % 2)
                ++it1;
            else
    //            vn.erase (it1);
                it1 = vn.erase (it1);
        print (vn);
        return 0;
    }

    4)成员函数
    front/back
    push_back/pop_back(没有push_front/pop_front)
    insert/erase
    size/empty/clear
    begin/end
    rbegin/rend
    operator[]
    所有的STL都有支持深拷贝的拷贝构造和拷贝赋值

    #include <iostream>
    #include <vector>
    using namespace std;
    void print (vector<int> const& vi) {
    for (vector<int>::const_iterator it =
    vi.begin (); it != vi.end ();
    ++it)
    cout << /*++*/*it << ' ';
    cout << endl;
    }
    void rprint (vector<int> const& vi) {
    for (vector<int>::const_reverse_iterator it =vi.rbegin (); it != vi.rend ();++it)
    cout << *it << ' ';
    cout << endl;
    }
    int main (void) {
    vector<int> vi;
    for (int i = 1; i <= 10; ++i)
    vi.push_back (i);
    size_t size = vi.size ();
    for (size_t i = 0; i < size; ++i)
    cout << vi[i] << ' ';
    cout << endl;
    for (vector<int>::iterator it =
    vi.begin (); it != vi.end ();
    ++it)
    cout << *it << ' ';
    cout << endl;
    print (vi);
    for (vector<int>::reverse_iterator it
    = vi.rbegin (); it != vi.rend ();
    ++it)
    cout << *it << ' ';
    cout << endl;
    rprint (vi);
    // vi: 1 2 3 4 5 6 7 8 9 10
    /*
    vi[4] = 50;
    print (vi);
    */
    vector<int>::iterator it1 =
    vi.begin ();
    /*
    *++++++++it1 = 50;
    */
    *(it1 + 4) = 50;
    print (vi);
    vector<int>::iterator it2 =
    vi.end () - 1;
    // 越靠近起始位置的迭代器越小,越靠近终止位置的迭代器越大
    cout << boolalpha << (it1 < it2)
    << endl; // true
    // it1 + 9 == it2
    cout << it2 - it1 << endl; // 9
    vector<int>::reverse_iterator it3 =
    vi.rbegin (), it4 =
    vi.rend () - 1;
    cout << (it4 < it3) << endl; // false
    cout << it3 - it4 << endl; // -9
    vector<int> vn;
    vn.push_back (100);
    it1 = vn.begin ();
    cout << *it1 << endl; // 100
    vn.push_back (200);
    it1 = vn.begin ();
    cout << *it1 << endl; // 100
    vn.clear ();
    vn.push_back (11);
    vn.push_back (22);
    vn.push_back (44);
    vn.push_back (33);
    vn.push_back (55);
    print (vn);
    it1 = vn.begin ();
    while (it1 != vn.end ())
    if (*it1 % 2)
    ++it1;
    else
    //    vn.erase (it1);
    it1 = vn.erase (it1);
    print (vn);
    return 0;
    }


    5)全局函数

    A.排序
    template<typename IT>
    void sort(IT begin, IT end);
    对[begin,end)区间内的元素做快速排序。
    在排序过程中,通过小于运算符比大小。
    template<typename IT, typename LESS>
    void sort (IT begin, IT end, LESS less);
    在排序过程中,通过小于比较器比大小。
    小于比较器可以是函数指针也可以是仿函数。
    B.find
    template<typename IT, typename KEY>
    IT find (IT begin, IT end, KEY key);
    如果查找成功返回在[begin,end)区间内第一个和key匹配的元素的迭代器,否则返回end。容器中元素的类型必须支持"=="运算符。

    #include <iostream>
    #include <vector>
    #include <algorithm> // 泛型算法
    using namespace std;
    template<typename T>
    ostream& operator<< (ostream& os,vector<T> const& vec) {
    for (typename vector<T>::const_iterator it = vec.begin ();it != vec.end (); ++it)
    os << *it << ' ';
    return os;
    }
    bool intCmp (int a, int b) {
    return a > b;
    }
    class IntCmp {
    public:
    bool operator() (int a, int b) const{
    return a > b;
    }
    };
    int main (void) {
    int ai[] = {13, 27, 17, 19, 51, 33};
    vector<int> v1 (ai, ai +
    sizeof (ai) / sizeof (ai[0]));
    cout << v1 << endl;
    sort (v1.begin (), v1.end ());
    cout << v1 << endl;
    //    sort (v1.rbegin (), v1.rend ());
    //    sort (v1.begin (), v1.end (),
    //    intCmp);
    sort (v1.begin (), v1.end (),
    IntCmp ());
    cout << v1 << endl;
    return 0;
    }
  • 相关阅读:
    Docker入门
    KMP算法
    spring boot整合Thymeleaf
    thymeleaf公共页面元素抽取
    入门oj 6492: 小B的询问
    入门oj 6451: The XOR Largest Pair之二
    入门oj 5499: 讲话模式
    把Windows CA根证书安装到iPhone
    笔记本电脑键盘状态助手KeyboardState
    开启Windows7多用户远程桌面
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/8668421.html
Copyright © 2011-2022 走看看