当前位置: 首页 > news >正文

js建设网站网站开发会遇到哪些问题

js建设网站,网站开发会遇到哪些问题,wordpress刷关键,网站开发设计中的收获文章目录vector的介绍vector的使用vector的定义方式vector的空间增长问题reserve和resizevector的迭代器使用begin 和endrbegin和rendinsert 和erasefind函数元素访问vector迭代器失效问题1#xff1a;inserse插入扩容时空间销毁造成野指针问题2#xff1a;erase删除或者inse… 文章目录vector的介绍vector的使用vector的定义方式vector的空间增长问题reserve和resizevector的迭代器使用begin 和endrbegin和rendinsert 和erasefind函数元素访问vector迭代器失效问题1inserse插入扩容时空间销毁造成野指针问题2erase删除或者insert插入时元素移动迭代器问题vector的介绍 1: vector是表示可变大小数组的容器。 2vector就像数组一样也采用的连续空间来存储元素这也意味着vector可以采用下标对vector的元素进行访问。 3vector与普通数组不同的是vector的大小是可以动态改变的。 4vector需要分配大小时其做法是分配一个新的数组然后将全部元素移入到这个数组当中并且释放原来的空间。 5由于vector采用连续的空间来存储元素与其他动态序列容器相比vector在访问元素的时候更加高效在其末尾添加和删除元素相对高效而对于不在其末尾进行的删除和插入操作效率则相对较低。 vector的使用 vector的定义方式 方式一构造一个vector类型的容器。 vectorint v1; 方式二 构造一个含有n各val的vector容器 vectorint v2(10, 2);方式三vector容器的拷贝构造 vectorintv3(v2);方式四使用迭代器区间构造该方式也可用于构造其他容器例如string类型。 vectorint v4(v2.begin(), v2.end()); 方式6像C语言定义数组一样定义。 vectorint v5{ 1,2,3,4,5};vector的空间增长问题 reserve和resize reserve说明 1改变容器的最大的最大容量当我们所传的值大于容器当前的 capacity时会将capacity扩大到该值。 2当所给值小于容器当前的capacity是reserve无效果。 resize说明 1当所传值大于容器当前的size时会将size扩大到所传值扩大的元素为第二个所传值如果用户没有给出则编译器会给上缺省值为0 2当所传值小于容器当前的size时则会将vector容器的size缩小到所传值大小。 int main() {vectorint v(10, 2);v.resize(15);//扩容并让size大小为155个0用来填充。for (size_t i 0; i v.size(); i){cout v[i] ;}cout endl;v.resize(10); //让size()大小变为10vector容量不变。for (size_t i 0; i v.size(); i){cout v[i] ;}cout v.capacity() endl; //20return 0; } vector的迭代器使用 begin 和end int main() {vector intv(10, 6);vectorint::iterator it v.begin();while (it ! v.end()){cout *it endl;it;}cout endl; } rbegin和rend int main() {vectorint v{ 1,2,3,4,5,6 };//反向迭代器遍历容器:reverse_iteratorvectorint::reverse_iterator rit v.rbegin();while (rit ! v.rend()){cout *rit ;rit;}cout endl;return 0; } insert 和erase insert函数可以在目标位置插入1个或者多个指定元素。 erase函数可以删除迭代器指定位置的元素也可以使用迭代器 进行删除。左闭右开 int main() {vectorint v;v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.pop_back();//插入位置插入个数插入值。v.insert(v.begin(), 3,1);for (size_t i 0; i v.size(); i){cout v[i] ;}cout endl;v.erase(v.begin(), v.begin() 1);for (size_t i 0; i v.size(); i){cout v[i] ;}cout endl;return 0; }find函数 find函数说明 使用find函数要确认所要删除位置的迭代器区间第三个参数则要确定用户所要寻找的值。 如果find函数在所传的迭代器区间找到了目标元素则返回目标元素迭代器否则则返回end位置迭代器。 int main() {vectorint v;v.push_back(1); //尾插元素1v.push_back(2); //尾插元素2v.push_back(3); //尾插元素3v.push_back(4);v.push_back(5);vectorint::iterator it v.begin();//在区间寻找值为2的元素并返回对应迭代器。//auto 根据后面的返回值类型主动判断。auto pos find(it, it 4, 2);if ( pos ! v,end()){//删除pos所指的元素。v.erase(pos);}for (size_t i 0; i v.size(); i){cout v[i] ;}cout endl;return 0; }元素访问 vector中除了使用vector迭代器进行访问的还可以使用[]操作符重载访问。 int main() {vectorint v(10, 1);//使用“下标[]”的方式遍历容器for (size_t i 0; i v.size(); i){cout v[i] ;}cout endl;return 0; } 另外vector还支持迭代器这也就说明vector还支持范围for进行访问。 int main() {vectorint v(10, 6);for (auto e : v){cout e ;}cout endl;return 0; }vector迭代器失效问题 1inserse插入扩容时空间销毁造成野指针问题 例如当我们从vector容器3的位置前插入30不对vector进行扩容时发现程序正常运行。 但是当我们插入数据时要对vector进行扩容却发现程序而不能崩溃了。 void test_vector1() {vector int v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (auto e : v){cout e ;}cout endl;auto p find(v.begin(), v.end(), 3));if (p ! v.end()){v.insert(p, 30);}for (auto e : v){cout e ;}}原因 当我们插入30时会发生第二次扩容此时find 找到了vector容器元素为3的位置并返回指向3的迭代器但是因为vector扩容后会对这原来的vector空间销毁此时返回的p并不是原来3的迭代器位置此时p已经变成了野指针insert时pos会导致导致程序崩溃。 以下insert 和 reserve 方法的底层实现 pos此时的值已经变成了随机值。 改善方法探讨 我们可以在扩容后更新pos指向的元素的位置。但是此时又有一个问题我们在扩容后重新修正了pos的位置时却发现p依旧是失效的原因是pos是形参p是实参。形参的改变并不会影响到实参。 此时我们可以在pos形参位置加入引用但是当我们使用 v.begin()为实参传入时却发现调用不成功因为此时的v.begin() 返回的值具有常性权限由小变大。 又或者我们可以返回pos位置的引用又说明引用的值可以被修改这又与STL insert方法的实现相违背。 解决方法 当使用insert后又要使用insert或者erase操作进行扩容或者缩容时因为在insert时扩容后已经重新对pos进行赋值但是因为pos终究是形参的改变无法影响到实参所以在insert后要使用变量去接受pos的位置。 void test_vector1() {vector int v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (auto e : v){cout e ;}cout endl;auto p find(v.begin(), v.end(), 3);if (p ! v.end()){v.insert(p, 30);//插入一个数后及时接受pos的位置后才能继进行插入。auto p find(v.begin(), v.end(), 3);v.insert(p, 30);}for (auto e : v){cout e ;}} int main() {test_vector1(); }2erase删除或者insert插入时元素移动迭代器问题 如果erase函数具有缩容功能时也会导致迭代器失效所以erase之后我们尽量不要直接对它进行访问。 第一种情况 程序正常运行 如果我们插入5个元素当it指向元素5时it正好指向v.end所以程序正常退出。 第二种情况 程序崩溃 如果我们插个4个元素当it指向元素4进行删除后 it但是v.end()指向了元素3的下一个位置而此时it又进行与v.end()正好错过了。所以本来应该删除4之后结束循环的如今只能进行删除。如果一直循环下去的化it就变成了野指针的在erase中对野指针访问后就会造成程序崩溃。 第三种情况 程序结果不对 当我们连续插入偶数时it指向元素2删除后原来在2后面的4向前移动了以为在下一次while循环中原本it指向4的现在指向了元素3元素4未被删除。 解决方法 针对插入4个元素时在不对迭代器i重新赋值时我们可以当it指向偶数就删除指向奇数就这样在最后删除4后it就不会像之前了此时it指向的位置正好等于v.end()结束循环。 再例如我们在偶数之前插入这个偶数的两倍。 如果我们不对it进行操作直接让it后进行访问 又因为再2的前面插入一个数后此时的2已经在原来的位置基础上向后移动了以为这样it又会指向元素2此刻便会不断循环对2的前面一个元素插入数字。 造成程序崩溃。 解决办法 我们要解决插入元素后it一直指向同一个数问题如果it指向偶数可以在偶数前插入一个术后it两次从而跳过已经插过数的偶数了。如果为奇数则直接it。
http://www.lakalapos1.cn/news/17397/

相关文章:

  • 北京网站建设在线重庆网站制作一般需要多少钱
  • 肯尼亚网站域名网站开发与维护的工资
  • 做企业网站需要准备什么wordpress删除重复文章
  • 通道县城市建设投资有限公司网站黄石网站建设
  • 网上支付网站怎摸做asp企业网站开发技术
  • wordpress临时关站国外大气网站
  • 上海优化排名网站网站地图写法
  • 怎么用虚拟主机做网站哪些网站是用asp.net开发的
  • 做尾货的网站做网站建设怎么赚钱
  • 网站管理 官网网站大全软件
  • 专题网站建设的请示专业网站建设设计装饰
  • 极速网站制作滨江道做网站公司
  • 青岛网站设计价格中信建设有限责任公司企业邮箱
  • 十堰微网站建设报价重庆妇科医院排名大全
  • 知名网站有哪些?门户网站需要多少空间
  • vue.js合作做网站么今天刚刚的最新新闻
  • au网站怎么注册微博营销策划方案范文
  • 成都旅游网站曲靖企业网站
  • 山西推广型网站开发wordpress discuz用户
  • 企业门户网站模板分享大气的建筑公司名字
  • 营销型网站建设哪好肃北蒙古族自治县建设局网站
  • 电商网站建设的内容免费搜索引擎入口
  • 装修公司网站源码php快递网站制作
  • 深圳知名网站网站做的一般怎么评价
  • 成都网站设计说明书设计作品
  • 咸阳市城乡建设规划局网站网站的建设的公司出名
  • sql server做网站打广告推广怎么做
  • asp网站 上传空间安卓应用开发工程师
  • 咋样建设网站wordpress免邮箱 注册
  • 桂林哪里做网站app制作多少钱一个