zoukankan      html  css  js  c++  java
  • C++ STL vector类型


    vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。注:vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。

    vector的构造函数原型:

    template<typename T>
       explicit vector();                                 // 默认构造函数,vector对象为空
       explicit vector(size_type n, const T& v = T());    // 创建有n个元素的vector对象
       vector(const vector& x);
       vector(const_iterator first, const_iterator last);

    举例:

    vector<string> v1;         // 创建空容器,其对象类型为string类
    vector<string> v2(10);     // 创建有10个具有初始值(即空串)的string类对象的容器
    vector<string> v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容器
    vector<string> v4(v3.begin(), v3.end());  // v4是与v3相同的容器(完全复制)
    

      

    vector的操作

    bool empty() const;                   // 如果为容器为空,返回true;否则返回false
    size_type max_size() const;       // 返回容器能容纳的最大元素个数
    size_type size() const;               // 返回容器中元素个数 
    size_type capacity() const;        // 容器能够存储的元素个数,有:capacity() >= size() 
    void reserve(size_type n);     ‍   // 确保capacity() >= n
    
    
    voidresize(size_type n, T x = T());  // 确保返回后,有:size() == n;如果之前size()<n,那么用元素x的值补全。
    reference front();                    // 返回容器中第一个元素的引用(容器必须非空)
    const_reference front() const;                  
    reference back();                     // 返回容器中最后一个元素的引用(容器必须非空)
    const_reference back() const;
    
    
    reference operator[](size_type pos);  // 返回下标为pos的元素的引用(下标从0开始;如果下标不正确,则属于未定义行为。
    const_reference operator[](size_type pos) const;
    reference at(size_type pos);                // 返回下标为pos的元素的引用;如果下标不正确,则抛出异常out_of_range
    const_reference at(size_type pos) const;
               
    void push_back(const T& x);      // [使用了堆栈] 向容器末尾添加一个元素         
    void pop_back();                       // [使用了堆栈] 弹出容器中最后一个元素(容器必须非空)
    
    // 注:下面的插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效
    iterator insert(iterator it, const T& x = T());           // 在插入点元素之前插入元素(或者说在插入点插入元素)
    void insert(iterator it, size_type n, const T& x);     // 注意迭代器可能不再有效(可能重新分配空间)
    void insert(iterator it, const_iterator first, const_iterator last);
    
    iterator erase(iterator it);                        // 删除指定元素,并返回删除元素后一个元素的位置(如果无元素,返回end())
    iterator erase(iterator first, iterator last);// 注意:删除元素后,删除点之后的元素对应的迭代器不再有效。
    
    void clear() const;                                    // 清空容器,相当于调用erase( begin(), end())
    
    void assign(size_type n, const T& x = T());   // 赋值,用指定元素序列替换容器内所有元素
    void assign(const_iterator first, const_iterator last);
    
    const_iterator begin() const;          //迭代序列
    iterator begin();
    const_iterator end() const;
    iterator end();
    
    const_reverse_iterator rbegin() const;
    reverse_iterator rbegin();
    const_reverse_iterator rend() const;
    reverse_iterator rend();
    

      

    vector对象的比较(非成员函数)

    针对vector对象的比较有六个比较运算符:operator==、operator!=、operator<、operator<=、operator>、operator>=。

    其中,对于operator==和operator!=,如果vector对象拥有相同的元素个数,并且对应位置的元素全部相等,则两个vector对象相等;否则不等。对于operator<、operator<=、operator>、operator>=,采用字典排序策略比较。注:其实只需要实现operator==和operator!=就可以了,其它可以根据这两个实现。因为,operator!= (lhs, rhs) 就是 !(lhs == rhs),operator<=(lhs, rhs) 就是 !(rhs < lhs),operator>(lhs, rhs) 就是 (rhs < lhs),operator>=(lhs, rhs) 就是 !(lhs, rhs)。

    vector类的迭代器
    vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算:it + n、it - n、it2 - it1。注意it2 - it1返回值为difference_type(signed类型)。注意,任何改变容器大小的操作都可能造成以前的迭代器失效。

    应用示例

    #include <iostream>
    #include <cassert>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<string> v(5, "hello");
        vector<string> v2(v.begin(), v.end());
       
       assert(v == v2);
       
        cout<<"> Before operation"<<endl;
        for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it)
            cout<<*it<<endl;
       
        v.insert(v.begin() + 3, 4, "hello, world");
        cout<<"> After insert"<<endl;
        for(vector<string>::size_type i = 0; i < v.size(); ++i)
            cout<<v[i]<<endl;
       
        vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6);
        assert(*it == "hello, world");
        cout<<"> After erase"<<endl;
        for(vector<string>::size_type i = 0; i != v.size(); ++i)
            cout<<v[i]<<endl;
       
        assert(v.begin() + v.size() == v.end());
        assert(v.end() - v.size() == v.begin());
        assert(v.begin() - v.end() == -vector<string>::difference_type(v.size()));
       
        return 0;
    }


    程序说明:上面程序中用了三个循环输出容器中的元素,每个循环的遍历方式是不一样的。特别需要说明的是,第二个循环在条件判断中使用了size() 函数,而不是在循环之前先保存在变量中再使用。之所以这样做,有两个原因:其一,如果将来在修改程序时,在循环中修改了容器元素个数,这个循环仍然能很好 地工作,而如果先保存size()函数值就不正确了;其二,由于这些小函数(其实现只需要一条返回语句)基本上都被声明为inline,所以不需要考虑效率问题。
    在网上找的 还有很多 建议你还是买一本stl看看里面有更详细的内容 而且比较基础

     

    2014-03-19 发于csdn, 19.10.27 迁移过来。

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/arxive/p/11747827.html
Copyright © 2011-2022 走看看