<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