zoukankan      html  css  js  c++  java
  • 8、泛型程序设计与c++标准模板库2.2向量容器

    向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)。这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的。而面向对象的向量是动态结构,他的大小不固定,可以在程序运行时增加或减少。

    向量容器可以用来实现队列、栈、列表和其他更加复杂的结构,事实上,向量容器可以用来实习那其他所有容器。使用向量容器之前必须包含头文件vector。

    1、向量容器的构造和析构函数

    容器类库中的向量容器包含有4中构造函数:

    vectot();//默认构造函数,它创建大小为零的向量容器。

    vector(size_type n,const T&value=T());//初始化了大小为n的向量,第二个参数是每个对象的初始值,默认为T()构造的对象。

    vector(const vector &x);//拷贝构造函数,用常数向量x来初始化此向量

    vector(const_iterator first,const_iterator last);//从支持常数迭代器const_iterator的容器中选取一部分来建立一个新的向量。

     像所有标准类库的集合和容器一样,向量容器具有自动存储管理功能。程序员不必写程序来分配或释放内存,向量容器可以自动管理内存。当一个向量离开作用域时,向量的析构函数将调用向量中元素的析构函数。向量的析构函数先从容器中移走现有的元素,每个元素都调用自身的析构函数。在元素被移走之后,向量回收分配给这些元素的内存并返回给操作系统。

    注意,如果仅从容器中移走元素,并不能收回这些元素占据的内存。它只是调用元素的析构函数。在使用erase()成员函数时也不回收内存,只是从容器中移走元素。

    2、使用向量容器

    1)访问向量容器信息

    向量容器有4个可以用来返回向量容器信息的成员函数:size()、max_size()、capcity()和empty()。原型如下:

    size_type size() const;//记录在容器中已经存放了多少元素

    size_type max_size() const;//返回记录容器最多可以容纳多少元素

    size_type capacity() const;//不必再次分配内存而在容器中最多可以容纳的元素数量

    bool empty() const;//如果容器为空则返回布尔型true,否则返回false。

    2)向向量容器中放置元素

    可以使用如下方法向向量放置元素:构造函数、push_back()方法、Insert()方法、"[]"运算符、"="运算符、swap()函数。函数原型如下:

    void push_back(const T& x);//将元素x添加在向量尾部,向量的内存不够时自动请求内存

    iterator insert(iterator it,const T& x=T());//把元素x复制到位置it之前

    void insert(iterator it,size_type n,const T& x);//把元素x 在位置it之前复制n次

    void insert(iterator it,const_iterator first,const_iterator last);//把位于范围[first,last]之间的元素复制到位置it之前

    void swap(vector x);//交换当前向量容器与向量x容器中的元素

    注意,每次重新分配内存后,向量容器的迭代器和引用都变得无效了。

    3)删除向量容器中的元素

    void pop_back();//删除向量中的最后一个元素

    iterator erase(iterator it);//删除it指向的元素

    iterator erase(iterator first,iterator lash);//删除[First,last]范围的所有元素

    void clear();//清楚整个向量容器,恢复到无任何元素时的状态,但保留缓冲区

    4)访问向量容器中的元素

    front()成员函数可以用来返回向量容器中的第一个元素。如果有向量容器A,调用front()将访问向量容器的A[0]元素。Back()成员函数可以用来返回容器的第n-1个元素。表达式A[N]表示相对于容器起始位置的第N个元素。使用"[]"运算符可以直接访问容器中的元素。向量容器支持随机访问迭代器。

    5)向量容器的例子

    #include<iostream>

    #include<iomanip>

    #include<vector>

    using namespace std;

    int main()

    {

     vector<int> A(10);//用来存放质数的向量,初始状态有10个元素

     int n;  //质数范围的上限,运行时输入

     int primecount = 0, i, j;

     cout << "Enter a value >=2 upper limit for prime numbers:";

     cin >> n;

     A[primecount++] = 2;//2是一个质数  

    for (i = 3; i < n; i++)  

    {   

    if (primecount == A.size())//如果质数表已满,   

     A.resize(primecount + 10);  

     if (i % 2 == 0)//大于2的偶数不是质数,因此略过本次循环的后续部分    

    continue;   //检测3,5,7,...,i/2是否为i的因子  

     j = 3;   

    while (j <= i / 2 && i%j != 0)    

    j += 2;  

     if (j>i / 2)  //若上述参数均不为i的因子,则i为质数   

     A[primecount++] = i;

     }

     for (i = 0; i < primecount; i++)//输出质数  

    {  

     cout << setw(5) << A[i];  

     if ((i + 1) % 10 == 0) //每输出10个数换行一次    

    cout << endl;

     }  

    cout << endl;

     getchar();

     getchar();

    }

  • 相关阅读:
    数据库索引的作用和长处缺点
    Spring的依赖注入
    Spring+Ibatis集成开发实例
    IOS开发之类和对象
    关于C++ const 的全面总结
    包管理器Bower使用手冊之中的一个
    项目总算完工了
    git reset and git checkout
    unity3D中协程和线程混合
    【剑指offer】左旋转字符串
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6308537.html
Copyright © 2011-2022 走看看