zoukankan      html  css  js  c++  java
  • 顺序容器操作fatal error C1001:warning D9028

     

    1.向顺序容器中添加元素错误程序:

        vector<int> vec1{ 5, 6, 7, 8, 9 };
        vector<int> vec2{ 3, 4, 5, 6, 7 };
        list<int> ilist{ 1, 2, 3, 4, 5 };
    
    
        //1.在尾部创建一个值t或者args,返回为void
        //1.1push_back(t)
        //1.2.emplace_back(args)
        vec1.push_back(10);
        for (auto i : vec1)
            cout << i << " ";
        cout << endl;
        vec1.emplace_back(11, 12, 13, 14);
        for (auto i : vec1)
            cout << i << " ";
        cout << endl;
    
        //2.在头部创建一个值t或者args,返回void;仅list forward_list deque支持push_front
        //2.1push_front(t)
        //2.2emplace_front(args)
        ilist.push_front(1);
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        ilist.emplace_front(1, 2, 3, 4);
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
    
        //3.在迭代器p指向的元素之前创建一个值为t或者args的元素
        //3.1c.insert(p,t)
        //3.1c.insert(p,n,t)n是t元素个数
        //3.1c.inser(p,b,e)b和e是另一个容器的两个迭代器
        //3.1c.insert(p,il)il是{}围起来的元素列表
        //3.2c.emplace(p,args)
        vector<int>::iterator beg = vec1.begin();
        vector<int>::iterator it = vec2.begin();
        vec2.insert(it, 0);//在首元素之前加0
        for (auto i : vec2)
            cout << i << " ";
        cout << endl;
        vec2.insert(it, 2, 1);//在首元素之前加两个1
        for (auto i : vec2)
            cout << i << " ";
        cout << endl;
        vec2.insert(it, beg + 3, beg + 6);//在it位置之前加入beg+3到beg+6的元素
        for (auto i : vec2)
            cout << i << " ";
        cout << endl;
        vec2.insert(vec1.end(), { 0, 0, 0, 0 });
        for (auto i : vec2)
            cout << i << " ";
        cout << endl;
        vec2.emplace(it + 2, 1);
       for (auto i : vec2)
            cout << i << " ";
        cout << endl;

    错误提示1.主要原因是因为上述红色部分:

    1>------ 已启动全部重新生成:  项目: test_vector, 配置: Debug Win32 ------
    1>  test.cpp
    1>f:program filesmicrosoft visual studio 12.0vcincludexmemory0(600): fatal error C1001: 编译器中发生内部错误1>  (编译器文件“f:ddvctoolscompilercxxfeslp1c	rees.h”,第 589 行)
    1>   要解决此问题,请尝试简化或更改上面所列位置附近的程序。
    1>  请选择 Visual C++
    1>  “帮助”菜单上的“技术支持”命令,或打开技术支持帮助文件来获得详细信息。
    1>         1>cl : 命令行 warning D9028: 最小重新生成失败,正在转换为标准生成
    ========== 全部重新生成:  成功 0 个,失败 1 个,跳过 0 个 ==========

    错误提示2程序中蓝色阴影部分:

                                             显示为out of range

    错误原因:

    vector 可变大小数组.支持快速随机访问。在尾部之外的位置插入或删除元素
    deque 双端队列。支持快速随机访问。在头尾位置插入、删除速度快
    list 双向链表。只支持单向顺序访问。在list任何位置进行插入、删除操作速度快
    forward_list 单向链表。只支持单向顺序访问。在链表任何位置进行插入、删除操作速度快
    array 固定大小数组,支持快速随机访问。不能添加或者删除元素  
    string 与vector相似的容器。但专门用于保存字符。随机访问快,在尾部插入、删除元素

    1.上述程序中需要修改的地方:

        vector<int> vec1{ 5, 6, 7, 8, 9 };
        vector<int> vec2{ 3, 4, 5, 6, 7 };
        list<int> ilist{ 1, 2, 3, 4, 5 };
    
    
        //1.在尾部创建一个值t或者args,返回为void
        //1.1push_back(t)
        //1.2.emplace_back(args)
        vec1.push_back(10);//{5,6,7,8,9,10}
        for (auto i : vec1)
            cout << i << " ";
        cout << endl;
        vec1.emplace_back(11);//此处修改为1个值,{5,6,7,8,9,10,11}
        for (auto i : vec1)
            cout << i << " ";
        cout << endl;
    
        //2.在头部创建一个值t或者args,返回void;仅list forward_list deque支持push_front
        //2.1push_front(t)
        //2.2emplace_front(args)
        ilist.push_front(1);//{1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        ilist.emplace_front(2);//{2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
    
        //3.在迭代器p指向的元素之前创建一个值为t或者args的元素
        //3.1c.insert(p,t)
        //3.1c.insert(p,n,t)n是t元素个数
        //3.1c.inser(p,b,e)b和e是另一个容器的两个迭代器
        //3.1c.insert(p,il)il是{}围起来的元素列表
        //3.2c.emplace(p,args)
        vector<int>::iterator beg = vec1.begin();
        list<int>::iterator it = ilist.begin();//此处将vector修改为ilist,下同
        ilist.insert(it, 0);//在首元素之前加0{0,2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        ilist.insert(it, 2, 1);//在首元素之前加两个1{0,1,1,2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        ilist.insert(it, beg, beg + 3);//在it位置之前加入beg到beg+3的元素,左闭右开区间{0,1,1,5,6,7,2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        ilist.insert(ilist.end() , { 0, 0, 0, 0 });//{0,1,1,5,6,7,2,1,1,2,3,4,5,0,0,0,0}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        ilist.emplace(it, 1);//{0,1,1,5,6,7,1,2,1,1,2,3,4,5,0,0,0,0}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;

     2.解释上述结果

    • 《C++ primer》中,提示:向一个vector、stringdeque插入元素会使所有指向容器的迭代器、引用 和指针失效->在一个vector或者string尾部之外的任何位置添加元素,都需要移动元素,而且,向一个vector或者string中添加元素可能引起整个对象存储空间的重新分配。
    • 容器插入元素其实是拷贝的过程;
    • insert操作返回的新添加的第一个元素的迭代器;
    • 迭代器在执行insert操作时,始终认为2元素的位置为首元素地址,若想改变使每一个都以最近的一个为首地址,则可以如下修改
        vector<int>::iterator beg = vec1.begin();
        list<int>::iterator it = ilist.begin();//此处将vector修改为ilist,下同
        ilist.insert(it, 0);//在首元素之前加0{0,2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        list<int>::iterator it1 = ilist.begin();
        ilist.insert(it1, 2, 1);//在首元素之前加两个1{1,1,0,2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        list<int>::iterator it2 = ilist.begin();
        ilist.insert(it2, beg, beg + 3);//在it位置之前加入beg到beg+3的元素{5,6,7,1,1,0,2,1,1,2,3,4,5}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        list<int>::iterator it3 = ilist.begin();
        ilist.insert(ilist.end(), { 0, 0, 0, 0 });//{5,6,7,1,1,0,2,1,1,2,3,4,5,0,0,0,0}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
        list<int>::iterator it4 = ilist.begin();
        ilist.emplace(it4, 1);//{1,5,6,7,1,1,0,2,1,1,2,3,4,5,0,0,0,0}
        for (auto i : ilist)
            cout << i << " ";
        cout << endl;
  • 相关阅读:
    Android接入WebView
    james邮件服务器部署
    防止网络攻击的方式
    vue开发遇到的问题及解决方式
    jekins和docker的作用
    设计模式(2)[JS版]---JavaScript如何实现单例模式?
    黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!
    什么是JavaScript 的闭包???
    纯CSS实现iOS风格打开关闭选择框
    纯CSS实现自定义单选框和复选框
  • 原文地址:https://www.cnblogs.com/lwflourish/p/4205495.html
Copyright © 2011-2022 走看看