在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1. 初始化c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如: std::vector<int> vecTest1(5); //初始化5个元素,每个都是0 std::vector<int> vecTest2{ 5 }; //初始化1个元素,值是5
2. 添加元素:push_back通过push_back添加新的元素进入vector后,vector的内存有时候会发生变化,这取决于size和capacity大小,当然这些都是系统来处理的,详细可以参考stl源码 当size<capacity的时候,直接加到末尾,不会变化 当size==capacity的时候,会重新申请另外一块内存,然后copy过去加到尾部,这个时候就会有变化了。 对于stl的容器,都有成员: begin() //起始位置 end() //结束位置 size() //当前大小 capacity() //当前容量,即已申请的内存大小 vector是一段连续的内存空间,有三个标识内存的位置,start,end,finish, size=end-start, capacity=finish-start 很多时候在使用vector的时候,会看到size=capacity,这个时候直接添加元素到尾部,内存明显是不够的,此时会重新在别处分配一块大小足够 至于为什么要重新在new,而不是直接扩容添加在后面,一个是空间换时间,另一个更大的原有是连续的内存直接加在后面不一定够,重新new保证成功率 有时候也有size<capacity, 这个时候就直接加在尾部了。 std::cout << "vecNum push back init" << std::endl; vector<int> vecNum(5); std::cout << "vecNum addr: " << &vecNum << std::endl; for(auto i = 5; i < 10; i++) { vecNum.push_back(i*10); std::cout << "vecNum push_back(" << i << ")=" << i*10 << std::endl; std::cout << "vecNum.size() = " << vecNum.size() << ",vecNum.capacity() = " << vecNum.capacity() << std::endl; std::cout << "vecNum.begin() addr: " << &(*vecNum.begin()) << std::endl; } std::cout << "vecNum addr: " << &vecNum << std::endl;
3. 关于earse和removeerase返回的是当前删除的元素的一下个位置的迭代器,所以需要注意的是遍历时候的++运算,这个与其它list,map差不多, 需要注意的earse后内存并未真正的清空,仅仅是删除内容,真正的容量大小capacity并没有改变,需要通过swap来实现capacity的减小 全部清空可以考虑:vector<int>().swap(vecNum); auto itor = vecNum.begin(); for( ; itor != vecNum.end(); ) { auto num = *itor; if(num == 60) { itor = vecNum.erase(itor); break; } else { itor++; } } std::cout << "after erase element 60:" << std::endl;
//remove只是通过迭代器的指针向前移动来删除,将不需要删除的元素往前移,因此需要删除的就都在尾部了 //返回新的指向尾部需要删除的元素的迭代器 因此还是得配合earse来使用,所以一般真要删除,建议直接遍历使用earse auto itor = remove_if(vecNum.begin(), vecNum.end(),[](int x)->bool{ return x == 20; }); //or //auto itor = remove(vecNum.begin(), vecNum.end(),20); //通过erase删除 vecNum.erase(itor, vecNum.end());
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论