首页 > 代码库 > 顺序容器操作fatal error C1001:warning D9028

顺序容器操作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.cpp1>f:\program files\microsoft visual studio 12.0\vc\include\xmemory0(600): fatal error C1001: 编译器中发生内部错误1>  (编译器文件“f:\dd\vctools\compiler\cxxfe\sl\p1\c\trees.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;

 

顺序容器操作fatal error C1001:warning D9028