顺序容器操作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;
原文地址:https://www.cnblogs.com/lwflourish/p/4205495.html