顺序容器操作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 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、string或deque插入元素会使所有指向容器的迭代器、引用 和指针失效->在一个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;
时间: 2024-10-06 00:28:32

顺序容器操作fatal error C1001:warning D9028的相关文章

【足迹C++primer】26、顺序容器操作

顺序容器操作 向顺序容器添加元素 forward_list //有自己专有版本的insert和emplace: forward_list //不支持push_back和emplace_back vector, string //不支持push_front和emplace_front c.push_back(t), c.emplace_back(args) //在c的尾部创建一个值为t的或者由args创建的元素,返回void c.push_front(t), c.emplace_back(args

Boost test vs2013 fatal error C1001

Boost test vs2013 fatal error C1001 Boost test库提供了一个用于单元测试的基于命令行界面的测试套件UTF:Unit Test Framework,具有单元测试.检测内存泄露.监控程序运行的功能.根据官网介绍boost支持很多编译器.然而在Visual Studio 2013中使用boost的test模块时会报致命错误,如下图所示: 输出报错信息如下: 1>------ Build started: Project: Test, Configuratio

fatal error c1001 编译器中发生内部错误 OpenMesh6.3

Internal Compiler Error VS 2015 Update1 VS2015 Update1 编译OpenMesh的额代码时发生错误 (compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\special.c', line 6211) 1> To work around this problem, try simplifying or changing the program near the locations listed a

C++ Primer笔记5_STL之顺序容器

1.STL(Standard Template Library) 标准模板库.从根本上说,STL是一些"容器"的集合,这些"容器"有list, vector,set,map等,STL也是算法和其它一些组件的集合.这里的"容器"和算法的集合指的是世界上很多聪明人很多年的杰作.每一个C++程序员都应该好好学习STL.大体上包括container(容器).algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接. 2

第9章 顺序容器

9.1顺序容器概述 vector       大小可变的数组.支持快速随机访问,在非尾部插入或者删除元素较慢. deque       双端队列.支持快速随机访问,在头尾插入删除速度很快. list             双向链表,只支持双向顺序访问.在当前位置插入删除操作速度很快. forward_list     单向链表.只支持单向顺序访问.在当前位置插入删除操作速度很快. array         固定大小数组.支持快速随机访问,不能添加删除元素. string        与ve

C++学习之顺序容器(一)

一个容器就是一些特定类型对象的集合.顺序容器(sequential container)为我们提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置向对应. 顺序容器类型概述 容器名称 容器特性 访问特性 修改特性 vector 可变大小数组 随机 尾部插入/删除速度快 deque 双端队列 随机 头尾位置插入/删除速度快 list 双向链表 双向顺序 任意位置插入/删除均很快 forward_list 单项链表 单向顺序 任意位置插入/删除均很快 array

C++primer笔记:IO库、顺序容器、关联容器、面向对象、泛型算法、模板和泛型编程

第八章:IO库不直接来处理输入输出,而是通过在标准库中的一些类型来处理io istream ostream cin cout cerr getline函数 iostream:定义了用于基本读写流的基本类型 fstream: 定义了基本的读写命名文件的类型 sstream:定义了读写内存的string对象的类型 IO对象无拷贝或者赋值 条件状态:IO定义了一些函数和标志,可以帮助我们访问和操作流得条件状态 strm::iostate 条件状态的完整功能 strm::badbit 流已崩溃 strm

c/c++ 标准顺序容器 容器的访问,删除 操作

c/c++ 标准顺序容器 容器的访问,删除 操作 pop_front:vector,string不支持 pop_back:forward_list不支持 知识点 1,front, back, at 成员函数的使用,对应代码里的test1 2,删除最后一个元素pop_back, 删除第一个元素pop_front,对应代码里的test2 3,删除指定位置的元素erase,并返回下一位置的迭代器 ,对应代码里的test3 #include <vector> #include <string&g

C++拾遗(四)——顺序容器

之前一篇博文(<初窥标准库>)简单了解了一种最常用的顺序容器:vector类型.本文将对该文内容进行进一步的学习和完善,继续讨论标准库提供的顺序容器类型.所谓顺序容器,即将单一类型的元素聚集起来成为容器,并根据位置来存储和访问这些元素.标准库定义了三种顺序容器类型:vector,list和deque(double-ended queue双端队列).同时还提供了三种顺序容器适配器(adaptor):stack,queue,priority_queue. 顺序容器 vector 支持快速随机访存