做商城网站设计,工业和信息化部五系网站建设,wordpress网站统计,怎样免费做网站推广更多精彩#xff0c;请点击上方蓝字关注我们#xff01;1. 初始化c 11以后新增了大括号{}的初始化方式#xff0c;需要注意与()的区别,如#xff1a;std::vectorint vecTest1(5); //初始化5个元素#xff0c;每个都是0std::vectorint vecTest2{ 5… 更多精彩请点击上方蓝字关注我们1. 初始化 c 11以后新增了大括号{}的初始化方式需要注意与()的区别,如 std::vectorint vecTest1(5); //初始化5个元素每个都是0 std::vectorint vecTest2{ 5 }; //初始化1个元素值是52. 添加元素push_back 通过push_back添加新的元素进入vector后vector的内存有时候会发生变化这取决于size和capacity大小当然这些都是系统来处理的详细可以参考stl源码 当sizecapacity的时候直接加到末尾不会变化 当sizecapacity的时候会重新申请另外一块内存然后copy过去加到尾部这个时候就会有变化了。 对于stl的容器都有成员 begin() //起始位置 end() //结束位置 size() //当前大小 capacity() //当前容量即已申请的内存大小 vector是一段连续的内存空间有三个标识内存的位置startendfinish sizeend-start capacityfinish-start 很多时候在使用vector的时候会看到sizecapacity这个时候直接添加元素到尾部内存明显是不够的此时会重新在别处分配一块大小足够 有时候也有sizecapacity, 这个时候就直接加在尾部了。std::cout vecNum push back init std::endl;
vectorint 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和remove erase返回的是当前删除的元素的一下个位置的迭代器所以需要注意的是遍历时候的运算这个与其它listmap差不多 需要注意的earse后内存并未真正的清空仅仅是删除内容真正的容量大小capacity并没有改变需要通过swap来实现capacity的减小 全部清空可以考虑vectorint().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; printVector(vecNum); vectorint(vecNum).swap(vecNum); //将vecNum的内存空洞清除 printVector(vecNum); //remove只是通过迭代器的指针向前移动来删除将不需要删除的元素往前移因此需要删除的就都在尾部了 //返回新的指向尾部需要删除的元素的迭代器 因此还是得配合earse来使用所以一般真要删除建议直接遍历使用earseauto 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());4. 关于vector bool -- 慎用 出处https://www.jb51.net/article/167636.htm vector bool 并不是一个STL容器不是一个STL容器不是一个STL容器 首先vector bool 并不是一个通常意义上的vector容器这个源自于历史遗留问题。早在C98的时候就有vector bool这个类型了但是因为当时为了考虑到节省空间的想法所以vector bool里面不是一个Byte一个Byte储存的它是一个bit一个bit储存的因为C没有直接去给一个bit来操作 所以用operator[]的时候 正常容器返回的应该是一个对应元素的引用 但是对于vector bool实际上访问的是一个”proxy reference”而不是一个”true reference”返回的是”std::vector bool:reference”类型的对象。 因此使用auto自动类型推导时会出现问题//vectorbool慎用 vectorbool vecBool { false, true, false }; bool test1 vecBool[0]; auto test2 vecBool[1]; test1 true; //test1的初始化它其实暗含了一个隐式的类型转换直接对vecBool[0]赋值会修改vecBool中的值但是对test1不会 test2 false; //test2它的类型并不是bool而是一个vector bool中的一个内部类,而此时如果修改test2的值vecBool中的值也会跟着修改 auto index 0; for (auto i : vecBool) { cout vecBool[ index ] i std::endl; index; }完它不仅仅是一个码扫码关注C资源免费送