htofly 2020-03-27
#include <iostream> #include <vector> using namespace std; //vector 容器构造 /*创建vector容器 vector<T> v; //采用模板实现类实现,默认构造函数 vector(v.begin(), v.end()); //将v[begin(), end())区间中的元素拷贝给本身。 vector(n, elem); //构造函数将n个elem拷贝给本身。 vector(const vector &vec); //拷贝构造函数。 */ void printVector(vector<int>&v) { for(vector<int>::iterator it=v.begin();it != v.end();it++) { cout <<*it << " "; } cout << endl; } void test01() { vector<int>v1; //默认构造 无参构造 for(int i=0;i<10;i++) { v1.push_back(i); } printVector(v1); //通过区间方式进行构造 vector<int>v2(v1.begin(),v1.end()); printVector(v2); //n个elem构造 vector<int>v3(10,100); printVector(v3); //拷贝构造 vector<int>v4(v3); printVector(v4); } //vector 赋值操作 /* 功能:给vector容器赋值 vector& operator=(const vector &vec);`//重载等号操作符 assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。 assign(n, elem); //将n个elem拷贝赋值给本身。 */ void test02(void) { vector<int>v1; for(int i=0;i<10;i++) { v1.push_back(i); } printVector(v1); //赋值 operator= vector<int>v2; v2=v1; printVector(v2); //assign vector<int>v3; v3.assign(v1.begin(),v1.end()); printVector(v3); // n个element方式 vector<int>v4; v4.assign(10,100); printVector(v4); } //vector容量和大小 /* empty(); //判断容器是否为空 capacity(); //容器的容量 size(); //返回容器中元素的个数 resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除。 resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除 */ void test03() { vector<int>v1; for(int i=0;i<10;i++) { v1.push_back(i); } printVector(v1); if(v1.empty()) //为真,代表容器为空 { cout << "v1为空"<<endl; } else { cout <<"v1不为空"<<endl; cout <<"v1的容量为: "<<v1.capacity()<<endl; cout <<"v1的大小为: "<<v1.size()<<endl; } //重新指定大小 v1.resize(15);//如果重新指定的比原来长,默认用0填充新的位置,参数2为默认填充值,v1.resize(15,100) printVector(v1); v1.resize(5);//如果重新指定的比原来短了,超出的部分会被删除掉 printVector(v1); } //vector插入和删除 /* push_back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele erase(const_iterator pos); //删除迭代器指向的元素 erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 clear(); //删除容器中所有元素 */ void test04(void) { vector<int> v1; //尾插 v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); //遍历 printVector(v1); //尾删 v1.pop_back(); printVector(v1); //插入 第一个参数是迭代器 v1.insert(v1.begin(),100); printVector(v1); v1.insert(v1.begin(),2,1000); printVector(v1); //删除 参数也是迭代器 v1.erase(v1.begin()); printVector(v1); //清空 //1.v1.erase(v1.begin(),v1.end()); v1.clear(); printVector(v1); } //vector数据存取 /* at(int idx); //返回索引idx所指的数据 operator[]; //返回索引idx所指的数据 front(); //返回容器中第一个数据元素 back(); //返回容器中最后一个数据元素 */ void test05(void) { vector<int>v1; for(int i=0;i<10;i++) { v1.push_back(i); } //利用[]的方式来访问数组中的元素 for(int i=0;i<v1.size();i++) { cout << v1[i]<<" "; } cout << endl; //利用at方式访问数组中的元素 for(int i=0;i<v1.size();i++) { cout << v1.at(i) <<" "; } cout << endl; //获取第一个元素 cout <<"第一个因素为 "<<v1.front()<<endl; //获取最后一个元素 cout <<"最后元素为 "<<v1.back()<<endl; } //互换容器 /* swap(vec); // 将vec与本身的元素互换 */ //1、基本使用 void test06(void) { vector<int> v1; for(int i=0;i<10;i++) { v1.push_back(i); } cout<<"交换前 "<<endl; printVector(v1); vector<int> v2; for(int i=10;i>0;i--) { v2.push_back(i); } printVector(v2); cout<<"交换后 "<<endl; v1.swap(v2); printVector(v1); printVector(v2); } //2、实际用途 //巧用swap可以收缩内存空间 void test07() { vector<int>v1; for(int i=0;i<100000;i++) { v1.push_back(i); } cout<<"v1的容量是 "<<v1.capacity()<<endl; cout<<"v1的大小是 "<<v1.size()<<endl; v1.resize(3);//重新指定大小 cout<<"v1的容量是 "<<v1.capacity()<<endl; cout<<"v1的大小是 "<<v1.size()<<endl; //巧用swap收缩内存 vector<int>(v1).swap(v1); cout<<"v1的容量是 "<<v1.capacity()<<endl; cout<<"v1的大小是 "<<v1.size()<<endl; //vector<int>(v) 匿名对象 //.swap(v)容器交换 } //vector预留空间 /* 功能描述: 减少vector在动态扩展容量时的扩展次数 reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。 */ void test10() { vector<int> v1; //利用reserve预留空间:如果数据量较大,可以一开始利用reserve预留空间 v1.reserve(100000); //不加这句话的,开辟次数会很多 int num=0;// 统计开辟的次数 int *p=NULL; for(int i=0;i<100000;i++) { v1.push_back(i); if(p!=&v1[0]) { p=&v1[0]; num++; } } cout <<"num= "<<num<<endl; } int main(void) { test01(); test02(); test03(); test04(); test05(); test06(); test07(); test10(); return 0; }