• 维克多配98k,天下无敌^_ ^,开个玩笑,下面进入正题:

ptr_vector

负责存放在容器内部指针的动态内存的生命期

vector

不负责存放在容器内部指针的动态内存的生命期

  • vector是动态空间,随着元素的加入,它会自动扩充空间容纳新元素。
  • 单端操作,尾插,尾删。
  • vector容器的迭代器:随机访问迭代器(迭代器+n可以通过编译)。它允许使用基于任何迭代器类型的算法,因为随机访问迭代器具有所有迭代器的功能。
  • 容量(capacity):空间然元素的个数。
  • 大小(size):空间实际存放元素的个数。
  • capacity >= size。
vector<int> v;
v.push_back(数据);
//往容器v中存放数据vector<int>::iterator beg = v.begin();
//起始迭代器:指向第0个元素的位置
//也可以利用自动类型推断auto:
auto beg = v.begin();vector<int>::iterator endi = v.end();
//结束迭代器:指向尾元素的下一个位置
void test01()
{//单端动态数组vector类模板vector<int> v;//v就是一个具体的vector容器//pash_ back尾部插入v.push_back(100) ;v.push_back(200) ;v.push_back(300) ;v.push_back(400) ;//访问数据//定义一一个迭代器存储v的起始迭代器vector<int>::iterator biginIt = v.begin() ;//定义:个迭代器存储v的结束迭代器vector<int>::iterator endIt = v.end() ;
}
//定义:个迭代器存储v的结束迭代器
vector<int>: :iterator endIt = V .end() ;
//for循环遍历1
for(;biginIt != endIt; biginIt++)
{//对迭代器取★代表的是容器的元素//*biginItcout<<*biginIt<<" ";
}
cout< <endl;
//for循环遍历2 (推荐)
for (vector<int>: :iterator it=v.begin(); it !=v.end(); it++)
{cout<<*it<<"." ;
}
cout<<endl;

容器嵌套容器

vector<vector<int>> v;
v.push_back(v1);
v.push_back(v2);
...
//需求在定义一一个vector容器存放v1 v2 v3
vector<vector<int>> v;
v.push_back(v1) ;
v.push_back(v2);
v.push_back(v3) ;
//for循环遍历
for (vector<vector<int>>: :iterator it = v.begin(); it!=v.end(); it++)
{//*it == vector<int> v1 v2 v3for(vector<int>: :iterator mit=(*it) .begin(); mit!=(*it) .end(); mit++ ){//*mit ==intcout<<*mit<<" " ;}cout<<endl;
}

vector构造函数

vector<T> v; //采用模板实现类实现,默认构造函数
vector<int> v(n);//创建大小为n容量的容器
vector(v.begin(),v.end());//将v[begin(), end()) 区间中的元素拷贝给本身。
vector(n,elem) ;//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷 贝构造函数。
  • 例子:
//vector(n,elem) ;//构造函数将n个elem拷贝给木身
vector<int> v1(10,5) ;
printVectorInt(v1) ;
//vector(v.begin(),v.end()) ;//将v [begin(),end()) 区间中的元素拷贝给本身
vector<int> v2(v1.begin()+2, v1.end()- 2) ;
printVectorInt(v2) ;
vector<int> v3(v1);
printVectorInt(v3) ;

vector常用的赋值操作

assign(beg, end) ;//将[beg, end) 区间中的数据拷贝赋伯给本身。
assign(n,elem);//将n 个elem拷贝赋值给本身。
vector& operator=(const vector &vec) ;//重载等号操作符
swap(vec);//将vec与 本身的元素互换。
  • 例子:
vector<int> v1(5,10) ;
vector<int> v2 ;
//vector& operator=(const vector &vec) ;/ /重载等号操作符
v2=v1;
printVectorInt(v2) ;
//assign(n,elem) ;//将n个elem拷贝赋值给木身
vector<int> v3 ;
v3.assign(5,100) ;
printVectorInt(v3) ;
//assign(beg,end) ;/ /将[beg,end) 区间中的数据拷贝赋值给本身
vector<int> v4;
v4.assign(v3.begin(),v3.end()) ;
printVectorInt(v4) ;
//swap(vec);//将vec与本身的元素互换。
vector<int> v5(5,20) ;
vector<int> v6(10,40) ;
printVectorInt(v5) ;
printVectorInt(v6) ;
v5.swap(v6) ;
printVectorInt(v5) ;
printVectorInt(v6) ;

vector大小操作

size();//返问容器中元素的个数
empty();//判断容器是否为空
resize(int num);// 重新指定容器的长度为num,若容器变长,则以默认值填充新位
置。如果容器变短,则木尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定 容器的长度为num,若容器变长,则以elem 值填
充新位置。如果容器变短,则末尾超出容器长>度的元索被删除。
capacity();//容器的容量
reserve(int len);// 容器预留Len_个元索长度,预留位置不初始化,元索不可访问。
  • resize只能作用于容器的大小size,不能作用于容量capacity。
  • 使用swap收缩容器的容量。
  • 收缩空间时,先使用resize,再使用swap。
//使用reszie将空间 置成10个元素(可以吗? )
v.resize(10) ; //不能修改容量只 能修改size
cout<<"size = "<<v.size()<<endl;// 10
cout<<"capactiy = "<<v.capacity()<<endl; //1024
//使用swap收缩容器的容量
vector<int>(v) . swap(v) ;
cout<<"size = "<<v.size()<<endl; //10
cout<<"capactiy =:"<<v.capacity()<<endl;//10

vector数据存取

at(int idx); //返回索引idx所指的数据, 如果idx越界,抛出out_ _of_ range异常。
operator[] ;//返回索引i dx所指的数据,越界时,运行直接报错
front() ;//返回容器中第一个数据元素
back() ;//返回容器中最后-一个数据元素
printVector Int(v) ;//10 20 30 40
cout<<v[2]<<endl; //30
cout<<v.at(2)<<endt;//30
//[] 越界不抛出异常
//at越界抛出异常
cout<<"front = "<<v.front()<<endl;//10
cout<<"back = "<<v.back()<<endl; //40

vector插入和删除

insert(const_iterator pos, int count,ele);
//迭代器指向位置pos插入count个元素ele.vector<int> old_v;
vector<int> new_v;
insert(old_v.begin(), new_v.begin() + 1, new_v.end());
//第一个参数指定了新元素的插入位置,
//第二个和第三个迭代器参数定义了被插入区间,
//该区间通常是另一个容器对象的一部分。//下面的代码将新元素插入到old.end()前面,
//即矢量最后一个元素的后面。
old_v.insert(old_v.end(), new_v.begin() + 1, new_v.end());push_back(ele); //层部插入 元素ele
pop_back();// 删除最后一个无杀
erase(const_iterator start, const_iterator end);
// 明除迭代群从start到end心间的元素
erase(const_iterator pos);// 刚除迭f器指向豹元素
clear();//删除容器中所存元素
//迭代器指向位置pos插入count个元素ele.
v.insert(v.begin()+2,3,100) ;
printVectorInt(v) ;//1020 100 100 100 30 40
//尾部删除: pop_ back();/ /删除最后-一个元素
v.pop_back();//将 40删除了
printVectorInt(v) ;/ /1020 100 100 100 30
//erase(const_iterator start, const_iterator end) ;
//删除迭代器从start到end之间的元素
v.erase(V .begin()+2, V .end()-1) ;
printVector Int(v) ;/ /1020 30
//erase(const_ iterator pos) ;//删除迭代器指向的元素
v.erase(v.begin()+1) ; //删除20的位置
printVectorInt(v);//10 30

rbegin(),rend()

  • 要反向打印容器的内容,vector类有一个名为rbegin()的成员函数和一个名为rend()的成员函数,前者返回一个指向超尾的反向迭代器,后者返回一个指向第一个元素的反向迭代器。因为对迭代器执行递增操作将导致它被递减,所以可以使用下面的语句来反向显示内容:
copy(dice.rbegin(), dice.rend(), out_iter);
// display in reverse order
  • rbegin()和end()返回相同的值(超尾),但类型不同(reverse_iterator和iterator)。同样,rend()和begin()也返回相同的值(指向第一个元素的迭代器),但类型不同。

vector未雨绸缪机制

  • 只要空间满了。就会另寻空间。
  • 测试:
void test03 ()
{int *p = NULL;int count =0;for(int i=0;i<1000;i++){if(p != &v[0] ){cout<<"----------"<<count++<<"-----<<endl ;p=&v[0] ;}v.push_back(i) ;cout<<"cacapity = "<<v.capacity()<<",size = "<<v.size()<<endl;
}

vector自定义排序规则

  • 可以重载“<”。在list中已经讲到。
  • 也可以用下面方式,使用sort()中的第三个参数指定排序规则即可。
bool myComparePerson(const Person &ob1, const Person &ob2)
{return ob1.age > ob2.age;
}
void test04()
{vector<Person> v;v. push_back(Person(" 德玛西亚",48));v. push_back(Person("提莫",28));v. push_back(Person("狗头", 18));v. push_back(Person("牛头",19));PrintVectorPerson(V);//默认比较方式从小-->大//vector存放自定义数据可指定排序规则( 普道函数)sort(v.begin(),v.end(), myComparePerson);PrintVectorPerson(v);
}

最新文章

  1. 深扒:一个司机如何潜入机房偷数据…
  2. 乐视电视明明可以降低配置,为什么偏偏要涨价?
  3. nb-iot模块的at指令_ESP8266-学习-01 系列了解模块针脚及烧录
  4. qt中关闭窗口资源释放问题
  5. Android app native代码性能分析
  6. OSChina 周一乱弹 ——程序员用代码写的爱情
  7. java 防止反射_Java设计模式(一):单例模式,防止反射和反序列化漏洞
  8. excel函数中if android,在Android中阅读Excel
  9. .sh文件是什么语言_FastDFS分布式文件系统的搭建安装
  10. linux sha1sum命令,讲解Linux中校验文件的MD5码与SHA1码的命令使用
  11. 为了做服务注册迁移,我提前准备了这些东西,来看看对你有没有用!
  12. android studio打测试包,AndroidStudio1.5上进行单元测试(简单)
  13. 锐浪报表数据源access_C# 锐浪报表 示例源码
  14. Java多线程系列--【JUC集合09】- LinkedBlockingDeque
  15. CGAL::2D Arrangements
  16. 自动化测试需要学习的知识
  17. C++OpenCV系统学习(17)——图像分割与抠图(6)——视频背景替换
  18. ははうえさま/亲爱的妈妈
  19. 【blade的UI设计】理解前端MVC与分层思想
  20. 面试题CSS02【21-10-14】

热门文章

  1. js中文转Unicode编码与解码
  2. Go 语言如何读取 excel 测试数据,简单易学
  3. 你一定要知道的保证线程安全的10个小技巧
  4. Java图片抓取2.0
  5. 新一代消息队列Pulsar-安装部署
  6. android localPlayer
  7. 《七年就是一辈子》 逻辑思维 互联网 得到
  8. Hybrid App 离线包方案实践
  9. html静态和后端,前台和后台,前端和后端
  10. 网付资讯:刷脸支付代理是正规的吗?