vector详讲(一)

<vector>头文件里带有两个类型参数的类模板,第一个参数是需要指定的数据类型,第二个是分配器(allocator)类型

template<class T, class Allocator = allocator<T>>   class vector;

用分配器来为元素分配内存和释放内存。需要注意的是vector的运算符operator[] 和方法 at()的区别就是。前者不进行边界检查,而后者进行边界检查,超出边界会抛出out_of_range()的异常;

#include <iostream>
#include <vector>
#include <limits>
int main()
{
    std::vector<double> vectorDouble;
    //int max = -std::numeric_limits<double>::infinity();
    //std::cout << "max : " << max << std::endl;      //2^31 = 2147483648;max = -2147483648;
    for(int i = 0;true;++i)
    {
        double temp = 0.0;
        std::cout << "enter scord(-1 is stop )" << i << ": ";
        std::cin >> temp;
        if(temp == -1)
        {
            break;
        }
        vectorDouble.push_back(temp);
//        if(temp > max)
//        {
//            max = temp;
//        }

    }

    //max /= 100.0;
    for(auto &element : vectorDouble)
    {
        //element = element / max;
        std::cout << element << " ";
    }
    return 0;
}

这里的numeric_limits<>模板详见  https://www.cnblogs.com/boost/p/10369272.html

vector的复制和赋值

vector储存对象的副本,其析构函数调用每个对象的析构函数,vector的赋值运算符和复制构造函数对所有的vector元素进行深度复制,处于效率的考虑,因该向函数和方法传递vector的引用或则是const引用。除了普通的复制和赋值外,vector还提供了assign()方法。这个方法可以删除所有的现存的元素,并且添加任意数目的元素;比如:

  

#include <iostream>
#include <vector>
#include <limits>
int main()
{
    std::vector<int> oneVector({1,2,3,4,5});
    for(auto temp : oneVector)
    {
        std::cout << temp << " ";
    }
    std::cout << std::endl;

    oneVector.assign(5,10);
    for(auto temp : oneVector)
    {
        std::cout << temp << " ";
    }
    return 0;
}

结果是:

1 2 3 4 5
10 10 10 10 10

这里用到了初始化列表(<initializer_list>),

vector还有函数swap()方法,这函数交换两个vector对象,前提是这两个vector的类型是一样的。

#include <iostream>
#include <vector>
#include <limits>
int main()
{
    std::vector<int> oneVector({1,2,3,4,5});
    //std::vector<int> twoVector({'a','b','c','d','e'});
    std::vector<int> twoVector(5,2);
    std::cout << "oneVector : ";
    for(auto temp : oneVector)
    {
        std::cout << temp << " ";
    }
    std::cout << std::endl;
    std::cout << "twoVector : ";
    for(auto temp : twoVector)
    {
        std::cout << temp << " ";
    }
    std::cout << std::endl;
    std::cout << "swap after : " << std::endl;
    oneVector.swap(twoVector);
    std::cout << "oneVector : ";
    for(auto temp : oneVector)
    {
        std::cout << temp << " ";
    }
    std::cout << std::endl;
    std::cout << "twoVector : ";
    for(auto temp : twoVector)
    {
        std::cout << temp << " ";
    }
    std::cout << std::endl;

    return 0;
}

结果是:

oneVector : 1 2 3 4 5
twoVector : 2 2 2 2 2
swap after :
oneVector : 2 2 2 2 2
twoVector : 1 2 3 4 5

vector的比较:vector模板类提供了六种比较运算符:== , != , > , < , >= , <= 

如果是两个vector元素的个数相同并且元素也相同,则这两个vector对象就相同,在比较的过程中采用的是字典顺序,即:当在0~i-1的时候,两个vector都是相等的,但是在第i个元素不相等,当vectorOne[i] < vectorTwo[i]的时候,则vectorOne < vectorTwo;

#include <iostream>
#include <vector>
#include <limits>
int main()
{
    std::vector<int> oneVector({1,2,3,4,5});
    std::vector<int> thridVector(5,2);
    std::vector<int> twoVector(5,2);
    if(twoVector == thridVector)
    {
        std::cout << "twoVector == thridVector" << std::endl;
    }else
    {
        std::cout << "twoVector != thridVector"<< std::endl;
    }

    if(oneVector == twoVector)
    {
        std::cout << "twoVector == oneVector" << std::endl;
    }else
    {
        std::cout << "twoVector != oneVector" << std::endl;
    }

    return 0;
}

结果是:

twoVector == thridVector
twoVector != oneVector

原文地址:https://www.cnblogs.com/boost/p/10369360.html